그래서 매우 간단한 설정을 Heroku에 있습니다. 백그라운드 작업 처리를 위해 RabbitMQ을 사용하고 있습니다. 내 설정은 Heroku 스케줄러 addon을 사용하여 매일 실행되는 노드 스크립트로 구성됩니다. 스크립트는 대기열에 작업을 차례로 추가하고 작업자를 처리하고 별도의 모듈로 위임하여 처리합니다. 내가 인스턴스를 다시 시작하기 전에, Heroku가이 수시로 무작위로 시작하는 SIGTERM 이벤트를받은 후 Heroku에서 NodeJS 작업자를 다시 시작한 후 대기중인 작업 다시 시작
문제
가 시작됩니다.인스턴스가 다시 시작된 후 어떤 이유로 작업자가 다시 백업되지 않습니다. 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이 heroku 프로세스를 종료 한 후 RMQ가 "unacked"상태의 메시지를 표시합니까? 연결 및 채널이 아직 열리고 있습니까? –"SIGTERM을 사용하여 모든 프로세스 중지" "프로세스가 상태 0으로 종료되었습니다."라는 메시지가 "종료 중"입니다. – yohairosen