2016-09-21 30 views
9

Vì vậy, tôi có thiết lập khá đơn giản trên Heroku. Tôi đang sử dụng RabbitMQ để xử lý các công việc trong nền. Thiết lập của tôi bao gồm tập lệnh nút chạy hàng ngày bằng cách sử dụng Trình lập lịch Heroku bổ trợ. Các kịch bản lệnh thêm các công việc vào hàng đợi, nhân viên lần lượt, tiêu thụ chúng và ủy quyền chúng vào một mô-đun riêng để xử lý.Tiếp tục công việc hàng đợi sau khi nhân viên NodeJS khởi động lại trên Heroku

Vấn đề bắt đầu sau khi tôi nhận được một SIGTERM trường hợp Heroku khởi ngẫu nhiên theo thời gian, trước khi khởi động lại ví dụ.

Vì một số lý do, sau khi cá thể được khởi động lại, nhân viên không bao giờ được sao lưu lại. Chỉ khi tôi khởi động lại thủ công bằng cách thực hiện heroku ps:scale worker=0heroku ps:scale worker=1 Nhân viên tiếp tục sử dụng các công việc đang chờ xử lý.

Dưới đây là công nhân của tôi:

// 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

được những gì bạn nhìn thấy trong các tập tin log từ heroku, sau khi SIGTERM xảy ra? bạn có nhận được thông báo "tắt" không? những gì về phía RMQ - sau khi SIGTERM tắt quá trình heroku, hiện RMQ hiển thị tin nhắn trong trạng thái "không bị"? bạn có thấy các kết nối và kênh vẫn mở không? –

+0

Không có thông báo "tắt" chỉ "Dừng tất cả các quy trình với SIGTERM" sau đó "Quy trình đã thoát với trạng thái 0". – yohairosen

Trả lời

1

Phương pháp close() trên jackrabbit đối tượng takes a callback, bạn nên tránh thoát quá trình này cho đến khi kết thúc:

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

cảm ơn. bạn có thể giải thích làm thế nào điều này có liên quan đến lý do tại sao thỏmq không tiếp tục xử lý các công việc nhắc nhở? – yohairosen

Các vấn đề liên quan