Herokuにはかなり簡単な設定があります。バックグラウンドジョブの処理にはRabbitMQを使用しています。私のセットアップは、Herokuスケジューラアドオンを使用して毎日実行されるノードスクリプトで構成されています。スクリプトはキューにジョブを追加し、ワーカーを順番に処理して消費し、別のモジュールに委譲して処理します。HerokuでNodeJSワーカーを再起動した後、キューに入れられたジョブを再開
私はHerokuのは、インスタンスを再起動する前に、随時、ランダムに開始することをSIGTERMイベントを受信した後に問題が開始されます。
インスタンスが再起動された後、何らかの理由で、ワーカーは決して再びバックアップを取得しません。 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);
あなたからログファイルに何を見ています英雄、SIGTERMが起こった後? 「シャットダウン」メッセージが表示されていますか? RMQ側では何が起こるのですか?SIGTERMがヒーロープロセスを停止した後、RMQはメッセージを「未実装」状態で表示しますか?あなたは接続とチャネルがまだ開いているのを見ていますか? –
「SIGTERMですべてのプロセスを停止しています」というメッセージが「シャットダウン」されません。 「プロセスはステータス0で終了しました」。ありがとう。 – yohairosen