2015-03-31 65 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功能向所有工作人員發出信號,告知他們應該暫停/恢復。