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