基於NODE.JS與KUE搭建消息隊列[轉]

轉自http://blog.xiamingxing.com/archives/262

基於node.js與kue搭建消息隊列

xiamingxingnodejs0 Comment

背景

在計算機科學中,消息隊列(英語: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

特性

https://github.com/Automattic/kue

遇到的問題

一、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');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章