9

だから私はHerokuでかなり単純なセットアップをしています。バックグラウンド ジョブの処理にRabbitMQを使用しています。私のセットアップは、 Heroku Schedulerアドオンを使用して毎日実行されるノード スクリプトで構成されています。スクリプトはジョブをキューに追加し、ワーカーは順番にそれらを消費し、処理のために別のモジュールに委任します。

インスタンスを再起動する前に、 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);
4

1 に答える 1