目前,我的系统是如何设计的,所以我将一个仅允许一个编码工作的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并将其置于工作人员列表中;当工作人员列表中有一半以上的工作人员处于繁忙状态时,便会提供更多的工作人员。在没有专用系统维护列表的情况下,维护该列表的最佳方法是什么。
答案 0 :(得分:0)
当然,最简单的方法是让一个主管节点对此进行评估。如果失败,则必须将该角色分配到您的工作节点。我建议您让每个等待工作的空闲节点检查工作人员列表,并进行测试以查看是否需要配置更多工作人员。
这很棘手,因为您将必须具有分布式锁,以防止多个工作人员同时执行此任务。