2016-09-21 64 views
9

所以我有一个相当简单的设置Heroku。我使用RabbitMQ来处理后台作业。我的设置由一个节点脚本组成,每天使用Heroku Scheduler addon。这些脚本将作业添加到队列中,然后将作业消耗并将它们委托给单独的模块进行处理。在Heroku上的NodeJS worker重启后恢复排队的作业

的问题开始我收到SIGTERM事件的Heroku随机启动自时间到时间后,重新启动实例之前。

由于某种原因,在实例重新启动后,工作人员再也不会恢复。只有当我通过执行heroku ps:scale worker=0heroku 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); 
+0

你这是在日志文件中看见heroku,在SIGTERM发生后?你是否收到“关闭”的信息?在RMQ方面呢 - 在SIGTERM关闭heroku进程之后,RMQ会以“未被执行”的状态显示消息吗?你看到连接和频道仍然开放吗? –

+0

没有“关闭”消息只是“停止所有与SIGTERM进程” 然后“进程退出状态0”。 – yohairosen

回答

1

jackrabbit对象takes a callbackclose()方法,你应该避免在退出的过程,直到完成:

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

谢谢。你能解释一下为什么rabbitmq不能恢复处理提醒工作吗? – yohairosen