轉自http://blog.xiamingxing.com/archives/262
基於node.js與kue搭建消息隊列
背景
在計算機科學中,消息隊列(英語:Message queue)是一種進程間通信或同一進程的不同線程間的通信方式。
在高併發或者在計算資源有限的情況下,由於來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達MySQL,直接導致無數的行鎖表鎖,甚至最後請求會堆積過多,從而觸發too many connections錯誤。通過使用消息隊列,我們可以異步處理請求,從而緩解系統的壓力。
簡介
kue是基於node.js構建的,redis支持的優先級任務隊列。
安裝
Latest release:
$ npm install kue
Master branch:
$ npm install http://github.com/Automattic/kue/tarball/master
特性
遇到的問題
一、MaxListenersExceededWarning
kue支持多進程及併發處理,當這兩種策略同時啓動時,會導致listener數急劇膨脹,導致以上錯誤,可以通過設置process.setMaxListeners(0);
來解決
二、隊列消息可以正常生產、消費,但是會觸發failed事件,導致頻繁重試
var kue = require('kue')
, queue = kue.createQueue();
queue.process('email', function(job, done){
email(job.data.to, done);
});
function email(address, done) {
if(!isValidEmail(address)) {
//done('invalid to address') is possible but discouraged
return done(new Error('invalid to address'));
}
// email send stuff...
done();
}
queue.process
的回調函數執行時,會在參數中傳遞done
函數。done
函數可以用來判斷一條消息是否處理完成及結果如何。例如:done(x)
,如果x不爲空,則表示本條消息處理失敗,producer
進入消息失敗的處理邏輯。
三、Typescript環境,導入ioredis時遇到的坑
需要通過如下方式導入:
import IORedis = require('ioredis');