2015-03-31 49 views
1

当在具有多个实例的应用程序中使用kue(例如在docker中说多个容器)时,它们都使用相同的redis数据库,如果暂停工作人员,是否需要在所有实例上暂停该worker,还是在redis级别进行处理并因此处理?Node.js Kue - 在具有多个实例的应用程序中暂停工作人员

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

通过代码的阅读,似乎暂停工作人员只是清理该工作人员的redis客户端,并停止侦听来自redis的事件。

这里是相关的代码。 https://github.com/Automattic/kue/blob/master/lib/queue/worker.js#L288-L302

所以没有什么会阻止同一个应用程序的另一个实例继续处理消息。因此,如果您有多个相同应用程序的实例正在运行,并且您想暂停一个工作人员,则必须向应用程序的每个实例发出发出暂停事件的信号。

我们正在使用redis中的pubsub功能向所有工作人员发出信号,告知他们应该暂停/恢复。