在Heroku上的NodeJS worker重启后恢复排队的作业
问题描述:
所以我有一个相当简单的设置Heroku。我使用RabbitMQ来处理后台作业。我的设置由一个节点脚本组成,每天使用Heroku Scheduler addon。这些脚本将作业添加到队列中,然后将作业消耗并将它们委托给单独的模块进行处理。在Heroku上的NodeJS worker重启后恢复排队的作业
的问题开始我收到SIGTERM事件的Heroku随机启动自时间到时间后,重新启动实例之前。
由于某种原因,在实例重新启动后,工作人员再也不会恢复。只有当我通过执行heroku ps:scale worker=0
和heroku ps:scale worker=1
手动重新启动时,工作人员才会继续使用挂起的作业。
这里是我的工人:
// worker.js
var throng = require('throng');
var jackrabbit = require('jackrabbit');
var logger = require('logfmt');
var syncService = require('./syncService');
var start = function() {
var queue = jackrabbit(process.env.RABBITMQ_BIGWIG_RX_URL || 'amqp://localhost');
logger.log({type: 'msg', msg: 'start', service: 'worker'});
queue
.default()
.on('drain', onDrain)
.queue({name: 'syncUsers'})
.consume(onMessage)
function onMessage(data, ack, nack) {
var promise;
switch (data.type) {
case 'updateUser':
promise = syncService.updateUser(data.target, data.source);
break;
case 'createUser':
promise = syncService.createUser(data.source);
break;
case 'deleteUser':
promise = syncService.deleteUser(data.target);
}
promise.then(ack, nack);
}
function onDrain() {
queue.close();
logger.log({type: 'info', msg: 'sync complete', service: 'worker'});
}
process.on('SIGTERM', shutdown);
function shutdown() {
logger.log({type: 'info', msg: 'shutting down'});
queue.close();
process.exit();
}
};
throng({
workers: 1,
lifetime: Infinity,
grace: 4000
}, start);
答
的jackrabbit
对象takes a callback上close()
方法,你应该避免在退出的过程,直到完成:
function shutdown() {
logger.log({type: 'info', msg: 'shutting down'});
queue.close(function (e) {
process.exit(e ? 1 : 0);
});
}
+0
谢谢。你能解释一下为什么rabbitmq不能恢复处理提醒工作吗? – yohairosen
你这是在日志文件中看见heroku,在SIGTERM发生后?你是否收到“关闭”的信息?在RMQ方面呢 - 在SIGTERM关闭heroku进程之后,RMQ会以“未被执行”的状态显示消息吗?你看到连接和频道仍然开放吗? –
没有“关闭”消息只是“停止所有与SIGTERM进程” 然后“进程退出状态0”。 – yohairosen