Node.js有哪些好的消息队列选项?

122

我想在正在使用node.js构建的小型Web应用程序中使用消息队列。我查看了resque,但不确定是否适合。目标是基于后端和其他客户端操作使用socketio向客户端推送通知。我本可以只使用socketio来实现这一点,但我想也许一个适当的消息队列会使此过程更加清晰,并且我不必重新发明轮子。

那么有哪些选择呢?


2
不确定,但这似乎是Node独自完成的好事! - TK-421
你可能已经意识到了,但 Modules 页面上列出了一个: https://github.com/ry/node/wiki/modules#message-queue。我猜总是需要考虑你自己开发所需的时间成本。 - TK-421
5
@ TK-421 和 Bjorn Tipling,如果您只有一个节点进程,那么它确实可以自己完成,但是如果您的应用程序的不同部分(如Web服务器、身份验证提供程序、通知中心等)由于使用了不同的进程,则需要外部解决方案,比如Redis。当然,您也可以与非node进程连接。 - Louis Chatriot
1
使用Node AMQ和Rabbit MQ的示例(生产者)https://gist.github.com/DarcInc/9641557和(消费者)https://gist.github.com/DarcInc/9641582。 - ipaul
1
如果您需要一个内存队列,可以考虑这个基于rxjs的解决方案。链接 - Marinos An
12个回答

57

8
我建议在Redis之上使用一个好的队列模块,就像RSMQ一样,它似乎非常简单易用。https://www.npmjs.com/package/rsmq - Exinferis
如果你只是想要消息传递的力量而不希望受到技术问题的干扰,那么你可以尝试 https://node-ts.github.io/bus/。 - Andrew dh

14
你可以使用STOMP客户端。这将允许您与各种消息队列集成,包括:
  • ActiveMQ
  • RabbitMQ
  • HornetQ
我以前没有使用过这个库,所以无法保证其质量。但是STOMP是一个相当简单的协议,因此如果必要,我认为您可以将其修改为所需形式。
另一个选择是使用beanstalkd和node。beanstalkd是一个用C编写的非常快速的“任务队列”,如果您不需要上述代理程序的功能灵活性,则非常好。

12

不要介意我自作聪明地插一句话:我正在开发Bokeh,它是一个简单、可扩展和高效的任务队列,基于ZeroMQ构建。它支持可插拔的数据存储来保留任务,目前支持内存、Redis和Riak。快去看看吧。


11

我可以提供以下几个建议:

node-amqp:这是一个RabbitMQ客户端,我已经成功地将其与Socket.IO结合使用,在实时多人游戏和聊天应用程序等方面使用。看起来非常可靠。

zeromq.node:如果您想采用无代理路线,这可能值得一看。需要更多的工作来实现功能,但您更有可能获得更低的延迟和更高的吞吐量。


1
在使用ZeroMQ方面我给出+1的推荐。经过大量的研究和时间花费在beanstalkd、RabbitMQ、BeeQueue、Bull和Kue上,最终我选择了ZeroMQ,特别是对于由工作进程驱动的轻量级项目而言,它是最好的选择。它运行速度非常快,文档也非常好。此外,它还有一个额外的好处,就是不会通过大量调用来阻塞您的Redis服务器。 - dimiguel
zeromq.node现在在这里维护:zeromq.js - Marinos An

9
请看node-busmq - 它是一个由redis支持的生产级别、高可用性和可扩展性的消息总线。 我为我们的全球云编写了这个模块,目前它在全球数个数据中心的生产环境中部署。 它支持命名队列、点对点通信、保证交付和联邦。 欲了解更多关于我们创建此模块的信息,请阅读此博客文章:All Aboard The Message Bus

7

我建议尝试使用Kestrel,它像Beanstalk一样快速简单,但支持扇出队列。同时,它还支持memcached。该系统是使用Scala构建的,在Twitter中得到了广泛应用。


7
值得注意的是,Kestrel已不再进行主动开发。 - GordyD

7

kue 是您所需的唯一消息队列。


33
除了 kue 没有得到良好维护,存在一些问题,而且没有一个测试! - vvo
4
还有,这是一个工作队列 - 不是一个消息队列。 - HyderA
它有几个问题,不适合生产使用。 - Rahul Kumar
2
使用 bull 对我来说更加简单。而在 kue 中,我在文档中迷失了方向。 - Marinos An

5

1
虽然RSMQ很好用,而且在我的生产环境中也运行良好,但请注意它在Redis中使用Lua脚本,并且无法与Redis集群/哨兵设置一起使用。 - naugtur

3
看看 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');

3

Azure ServiceBus怎么样?它支持nodejs。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接