在具有多个实例(比如docker中的多个容器)的应用程序中使用kue时,所有实例都使用相同的redis数据库,如果暂停一个worker,是否需要在所有实例上暂停该worker,或者是在redis级别因此为您处理?
https://github.com/Automattic/kue#pause-processing
queue.process('email', function(job, ctx, done){
ctx.pause( 5000, function(err){
console.log("Worker is paused... ");
setTimeout( function(){ ctx.resume(); }, 10000 );
});
});
如果我们不必使用任何实例到实例的通信来让所有工作人员暂停,那就太棒了。
答案 0 :(得分:0)
通过阅读代码,似乎暂停工作人员只是清理该工作人员的redis客户端并停止从redis中侦听事件。
这是相关代码。 https://github.com/Automattic/kue/blob/master/lib/queue/worker.js#L288-L302
因此,没有什么可以阻止同一应用程序的另一个实例继续处理消息。因此,如果您运行同一应用程序的多个实例,并且想要暂停工作程序,则必须向应用程序的每个实例发出暂停事件发生的信号。
我们正在使用redis中的pubsub功能向所有工作人员发出信号,告知他们应该暂停/恢复。