2016-09-21 19 views
9

Herokuにはかなり簡単な設定があります。バックグラウンドジョブの処理にはRabbitMQを使用しています。私のセットアップは、Herokuスケジューラアドオンを使用して毎日実行されるノードスクリプトで構成されています。スクリプトはキューにジョブを追加し、ワーカーを順番に処理して消費し、別のモジュールに委譲して処理します。HerokuでNodeJSワーカーを再起動した後、キューに入れられたジョブを再開

私はHerokuのは、インスタンスを再起動する前に、随時、ランダムに開始することをSIGTERMイベントを受信した後に問題が開始されます。

インスタンスが再起動された後、何らかの理由で、ワーカーは決して再びバックアップを取得しません。 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

あなたからログファイルに何を見ています英雄、SIGTERMが起こった後? 「シャットダウン」メッセージが表示されていますか? RMQ側では何が起こるのですか?SIGTERMがヒーロープロセスを停止した後、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