在Heroku上的NodeJS worker重新启动后恢复排队的作业

所以我在Heroku上有一个相当简单的设置。 我正在使用RabbitMQ来处理后台作业。 我的设置由每天使用Heroku Scheduler插件运行的节点脚本组成。 这些脚本将作业添加到队列中,然后工作人员将其消耗并委托给单独的模块进行处理。

我收到一个SIGTERM事件, Heroku不时随机启动,重新启动实例之前,问题就开始了。

出于某种原因,在实例重新启动后,工作人员再也不会恢复。 只有当我通过做heroku ps:scale worker=0heroku ps:scale worker=1来手动重新启动时,worker才会继续使用未完成的作业。

这是我的工人:

 // 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对象上的close()方法需要callback ,您应该避免退出进程直到完成:

 function shutdown() { logger.log({type: 'info', msg: 'shutting down'}); queue.close(function (e) { process.exit(e ? 1 : 0); }); }