nodejs有哪些好的消息队列选项?[关闭]


112

希望在我正在使用node.js构建的小型Web应用程序中使用消息队列。我看了resque,但不确定是否合适。目标是基于套接字和后端的其他客户端操作将通知推送到客户端。我可以只用socketio来做到这一点,但我认为也许适当的消息队列可以使这个清理器更干净,而我不必重新发明轮子。

有哪些选择?


2
不能确定,但​​是这似乎可以使节点本身做好!
TK-421

您可能已经意识到了这一点,但是“模块”页面上列出了一个:github.com/ry/node/wiki/modules#message-queue。我想总是有您自己的开发时间需要考虑的成本。
TK-421

5
@ TK-421和Bjorn Tipling,只要您只有一个节点进程,这确实是节点可以做的事情。如果您对应用程序的不同部分(例如,Web服务器,身份验证提供程序,Notif Center等)具有不同的流程,则需要外部解决方案(例如Redis)。当然,您也可以连接非节点进程。
Louis Chatriot 2012年

1
使用Node AMQ和Rabbit MQ的示例(Producer)gist.github.com/DarcInc/9641557和(Consumer)gist.github.com/DarcInc/9641582
ipaul 2014年

1
如果您需要内存中的队列,可以考虑使用基于rxjs的解决方案
Marinos,

Answers:



12

您可以使用节点STOMP客户端。这将使您与各种消息队列集成,包括:

  • ActiveMQ
  • 兔子MQ
  • 大黄蜂

我以前没有使用过该库,因此无法保证其质量。但是STOMP是一个非常简单的协议,因此我怀疑您可以在必要时将其黑客提交。

另一种选择是将beantalkd与node一起使用。beanstalkd是一个用C语言编写的非常快速的“任务队列”,如果您不需要上面列出的代理的功能灵活性,则非常好。


10

无耻的插件:我正在研究Bokeh:建立在ZeroMQ 上的简单,可伸缩和快速的任务队列。它支持用于持久任务的可插拔数据存储,目前支持内存,Redis和Riak。看看这个。


10

我可以提出一些建议:

node-amqp:我已经成功地与Socket.IO结合使用的RabbitMQ客户端,用于制作实时多人游戏和聊天应用程序。似乎足够可靠。

zeromq.node:如果您想沿着非经纪路线走下去,这可能值得一看。实现功能需要做更多的工作,但是您更有可能获得更低的延迟和更高的吞吐量。


1
使用ZeroMQ时+1。经过大量的研究并花了很多时间与beantalkd,RabbitMQ,BeeQueue,Bull和Kue进行修补,ZeroMQ最终成为了我的最佳体验,尤其是对于由工人驱动的轻型项目。闪电般快速,文档是一流的。它还具有不阻塞大量呼叫的Redis服务器的附加好处。
dimiguel

zeromq.node现在在此处维护:zeromq.js
Marinos

8

看看node-busmq这是一种生产级,高度可用且具有可伸缩性的消息总线,由redis支持。

我为我们的全球云编写了该模块,目前已在全球多个数据中心的生产环境中部署了该模块。它支持命名队列,对等通信,保证的传递和联合。

有关为什么我们创建此模块的更多信息,您可以阅读以下博客文章:消息总线上的所有内容


6

kue是您唯一需要的消息队列


27
除了kue维护得不好之外,它有多个问题,并且没有一项测试!
vvo

4
此外,这是一个作业队列-不是一个消息队列
HyderA

它有几个问题,不适合生产
Rahul Kumar,

1
使用bull对我来说更简单。随着kue我迷失在文档中。
马里诺斯(Marinos)


3

您可能想看看

用于Node.js的Redis简单消息队列

它使用Redis并提供Amazon SQS的大多数功能。


1
虽然RSMQ很不错,并且已经在生产中为我工作了一次,但是请注意,它在Redis中使用Lua脚本,并且无法与Redis集群/前哨设置一起使用
naugtur

2

Azure ServiceBus怎么样?它支持nodejs。


1

看一下node-queue-lib。也许您就足够了。它支持node.js和浏览器。有两种传送策略:广播和循环传送。只有JavaScript。

快速示例:

var Queue = require('node-queue-lib/queue.core');

var queue = new Queue('Queue name', 'broadcast');

// subscribe on 'Queue name' messages
queue.subscribe(function (err, subscriber) {
    subscriber.on('error', function(err){
        //
    });
    subscriber.on('data', function (data, accept) {
        console.log(data);
        accept(); // accept process message
    });
});

// publish message
queue.publish('test');

1

我像您描述的那样将KUE与socketIO一起使用。我将socketID与作业一起存储,然后可以在作业完成中检索它。.KUE基于redis,并在github上有很好的示例

像这样...

jobs.process('YourQueuedJob',10, function(job, done){
    doTheJob(job, done);
});


function doTheJob(job, done){
    var socket = io.sockets.sockets[job.data.socketId];
    try {
        socket.emit('news', { status : 'completed' , task : job.data.task });
    } catch(err){
        io.sockets.emit('news', { status : 'fail' , task : job.data.task , socketId: job.data.socketId});
    }
    job.complete();
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.