自主维护可用工人状态的最佳方法是什么?

时间:2018-10-03 11:37:19

标签: node.js redis architecture load-balancing

目前,我的系统是如何设计的,所以我将一个仅允许一个编码工作的1核心实例假脱机。该实例连接到Redis,并等待填充编码作业列表。然后,工作人员从列表中弹出工作,并在工作运行时立即将自己设置为繁忙,工作完成后,它会继续寻找未完成的工作。

我的示例worker.js

module.exports = function (redisClient) {
  const spawn = require('child_process').spawn;
  var busy = false;
  function startCoStream(job) {
    console.log(job);
    busy = true;
    var proc = spawn('./costream.sh', [job.streamKey, job.leftIngest, job.leftKey, job.rightIngest, job.rightKey]);
    proc.on('exit', function (code, signal) {
      busy = false;
      readJobBus();
    });
    proc.stderr.setEncoding('utf8');
    proc.stderr.on('data', (chunk) => { 
      console.log(chunk);
    });
  }
  function readJobBus () {
    if (busy) return;
    redisClient.lpop('jobbus', function(err, reply) {
      if (!reply && !err) {
        setTimeout(readJobBus, 1000);
      }
      else {
        var job = JSON.parse(reply);
        if (job.type==0) {
          startCoStream(job);
        }
      }
    });
  }
  readJobBus();
  return redisClient;
}

这在我当前的设置中运行得很好,唯一的问题是我需要提前知道预期的编码过程数量并手动配置实例。我的问题是,什么是使系统保持自治和松散耦合的最佳方法,同时又要维护一组忙碌且可用的工作人员,以便我实现自动缩放。

想法1)在启动工作程序时,将工作程序注册到可用的工作程序列表中,然后在流程开始时将其从列表中删除,并在完成该过程后将其重新添加。 问题1)如果工作人员仍在可用列表中时死亡,那么该列表将显示1个可用工作人员,然后显示应用程序的实际状态。

有什么好的方法?期望的结果很简单。设置工作人员后,它将连接到Redis并将其置于工作人员列表中;当工作人员列表中有一半以上的工作人员处于繁忙状态时,便会提供更多的工作人员。在没有专用系统维护列表的情况下,维护该列表的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

当然,最简单的方法是让一个主管节点对此进行评估。如果失败,则必须将该角色分配到您的工作节点。我建议您让每个等待工作的空闲节点检查工作人员列表,并进行测试以查看是否需要配置更多工作人员。

这很棘手,因为您将必须具有分布式锁,以防止多个工作人员同时执行此任务。

  1. 尝试获取超级用户锁,如果被阻止,请转到#4
  2. 检查忙碌的工人数量,并在必要时提供更多
  3. 释放管理员锁定
  4. 找工作