ActiveMQ或RabbitMQ或ZeroMQ或[关闭]


645

我们很想听听ActiveMQ,RabbitMQ和ZeroMQ的优缺点。也欢迎提供有关任何其他有趣消息队列的信息。


2
我是消息队列的新手,正在stackoverflow.com/q/1035949/181870上阅读有关它的实际用例的更多信息。后来,在搜寻与消息队列(特别是JMS)相关的主题/文章时,我遇到了OpenJMS,这是Sun Microsystems的Java Message Service API 1.1规范的开源实现。令我惊讶的是,这里没有涵盖/讨论它吗?我只是想向社区咨询OpenJMS是否与该主题/讨论有关,如果有的话,根据OP,任何具有相同优点和缺点的经验都将有所帮助。
2011年

3
3年后,这里为人们浏览提供了一条注释...考虑一下为什么要使用消息队列中间件。如果原因是要在群集中分发任务,请查看Celery。它比MQ样式的解决方案具有更高的抽象级别,使用RabbitMQ移动消息,但是对特定于任务的语义提供了出色的支持。
克里斯·约翰逊

Answers:


342

编辑:我最初的答案非常关注AMQP。我决定重写它以提供对该主题的更广泛的了解。

这三种消息传递技术在构建分布式系统上具有不同的方法:

RabbitMQ是AMQP协议(以及Apache Qpid)的主要实现之一。因此,它实现了代理体系结构,这意味着消息在发送给客户端之前先在中央节点上排队。这种方法使RabbitMQ易于使用和部署,因为仅几行代码就支持路由,负载平衡或持久消息队列等高级方案。但是,这也使它的可伸缩性和“速度变慢”了,因为中央节点增加了延迟,并且消息包络很大。

ZeroMq是一种非常轻巧的消息传递系统,专门为高吞吐量/低延迟的方案(如您在金融界发现的方案)设计。Zmq支持许多高级消息传递场景,但是与RabbitMQ相反,您必须自己通过组合框架的各个部分(例如:套接字和设备)来实现它们中的大多数。Zmq非常灵活,但是您必须先阅读该指南80页左右的内​​容(即使您不使用Zmq,我也建议阅读该指南的读者,即使您不使用Zmq,也要阅读该指南),然后才能做比发送消息更复杂的事情在2个同行之间。

ActiveMQ位于中间。与Zmq一样,它可以与代理和P2P拓扑一起部署。像RabbitMQ一样,实现高级方案更容易,但是通常以原始性能为代价。这是消息传递的瑞士军刀:-)。

最后,所有3个产品:

  • 具有最常用语言(C ++,Java,.Net,Python,Php,Ruby等的客户端api)
  • 有强大的文档
  • 得到积极支持

22
虽然正确,但我不确定采用AMQP是否与原始问题有很强的相关性。我认为,选择消息队列要比使用什么底层有线协议更重要的考虑因素。
StaxMan 2010年

8
这个问题没有提到需要AMQP,但是这个答案集中在AMQP上。如果我们假设JMS是必需的,那么答案基本上是相反的:ActiveMQ最流行,RabbitMQ提供了一些可能应该起作用的支持。如果未采用有线协议:请参阅其他答案。
陈伟伟

19
我曾在RabbitMQ和ActiveMQ工作过,所以建议您远离ActiveMQ。这些版本的漏洞非常多,并且我没有遇到任何有关机器宕机和内存泄漏等问题的信息……另一方面,RabbitMQ可以正常工作。插入电源后,我再也无需再次查看它。它只是做它所需要的。如果愿意,我在我的博客jarloo.com/rabbitmq-c-tutorial
Kelly

2
在查看RabbitMQ与ActiveMQ的职位后,似乎对RabbitMQ的需求更大。ActiveMQ已经存在了更长的时间,但雇主们几乎提出了同样的要求。

1
ZMQ指南也确实很有趣而且很不错:)
meawoppl

174

您为什么想念SparrowStarlingKestrelAmazon SQSBeanstalkdKafkaIronMQ

消息队列服务器

消息队列服务器支持多种语言,包括Erlang(RabbitMQ),C(beanstalkd),Ruby(Starling或Sparrow),Scala(Kestrel,Kafka)或Java(ActiveMQ)。简短的概述可以在这里找到

麻雀

  • 由Alex MacCaw撰写
  • Sparrow是用Ruby编写的轻量级队列,“可以说出内存缓存”

史达琳

红est

  • Robey Pointer撰写
  • 用Scala(Starling从Ruby到Sc​​ala的端口)编写的Starling克隆
  • 队列存储在内存中,但记录在磁盘上

兔子MQ

  • RabbitMQ是Erlang中的消息队列服务器
  • 将作业存储在内存中(消息队列)

Apache ActiveMQ

  • ActiveMQ是Java中的开源消息代理

豆茎

亚马逊SQS

卡夫卡

  • 写在Scala的LinkedIn
  • LinkedIn用来卸载所有页面和其他视图的处理
  • 默认为使用持久性,对热数据使用OS磁盘缓存(吞吐率高于上述任何一种启用持久性的数据)
  • 同时支持在线和离线处理

ZMQ

  • 充当并发框架的套接字库
  • 比TCP更快,适用于集群产品和超级计算
  • 跨inproc,IPC,TCP和多播传送消息
  • 通过扇出,发布订阅,管道,请求-回复连接N对N
  • 异步I / O,可扩展的多核消息传递应用

EagleMQ

  • EagleMQ是一个开源,高性能,轻量级的队列管理器。
  • 用C写
  • 将所有数据存储在内存中并支持持久性。
  • 它有自己的协议。支持使用队列,路由和通道。

IronMQ

  • IronMQ
  • 用Go写
  • 完全托管的队列服务
  • 提供云版本和本地版本

我希望这对我们有帮助。 资源


您是否对在此问题的评论区域中提出的问题有任何想法/想法/要补充/评论-stackoverflow.com/questions/731233/…
加纳南姆

他们有竞争管理吗?我总是在队列系统中发现此问题。例如,如果队列已满,则根据元素数量(而不是基于内存资源)阻止生产者。
sw。

1
queues.io-记住添加此处和此处缺少的详细信息。
asyncwait 2013年

83

比您想知道的更多信息:

http://wiki.secondlife.com/wiki/Message_Queue_Evaluation_Notes


更新

只是详细说明保罗在评论中添加的内容。上面提到页面在2010年之后已经死了,请仔细阅读。在3年内,很多东西已经改变了。

维基页面的历史


7
我认为这些人正在考虑错误的队列-每个用户的队列不应为1(或更多)。他们应该将工作排在几个队列中,然后加以利用。每个用户的收件箱(或mbox)。
Michael Deardeuff 2010年

1
迈克尔-想详细说明吗?问题是基于群聊的系统中的实时传递。如果我理解正确,那么您是在谈论将消息作为端点(收件箱)的持久存储机制吗?如果是这样,那不符合要求,他们希望立即进行聊天,并且客户是直接订户吗?据我所知,拥有大量基于主题的队列不是优化的用例吗?
乔什(Josh)2010年

1
更新:SecondLife Wiki页面写于2009年。到了2013年,由于所有MQ的持续改进,提到的关于他们研究的不同消息队列的许多特定要点不再是最新的。从某种意义上讲,到目前为止,他们测试的大多数或所有MQ都更好。
Paul Legato

71

这确实取决于您的用例。

将0MQ与ActiveMQ或RabbitMQ进行比较是不公平的。ActiveMQ和RabbitMQ是消息传递系统,需要安装和管理。他们提供的功能远不止ZeroMQ。它们具有真正的持久队列,对事务的支持等。

ZeroMQ是一种轻量级的面向消息的套接字实现。它还适用于进程内异步编程。可以在ZeroMQ上运行“企业消息系统”,但是您必须自己实施很多工作。

所以:

ActiveMQ,RabbitMQ,Websphere MQ和MSMQ是“企业消息队列”

ZeroMQ是面向消息的IPC库。


7
您可以使用多个。rabbitmq.com/blog/2010/10/18/rabbitmq0mq-bridge讨论了如何使用0MQ在多个RabbitMQ代理之间进行桥接并创建松耦合的联合。
迈克尔·狄龙

34

还有的RabbitMQ和ActiveMQ的之间的比较在这里。开箱即用,ActiveMQ配置为保证消息传递-与较不可靠的消息传递系统相比,它可以使印象变慢。如果愿意,您始终可以更改配置以提高性能,并至少获得与任何其他邮件系统一样好的性能。至少您可以选择。论坛和ActiveMQ FAQ上有很多信息,这些内容用于配置以实现扩展,性能和高可用性。而且,在规范最终定稿时,ActiveMQ将支持AMQP 1.0,以及其他有线格式,如STOMP。

ActiveMQ的另一个优点是它的一个Apache项目,因此开发人员社区中存在多样性-而且它与一家公司无关。


22

我没有使用过ActiveMQ或RabbitMQ,但已经使用了ZeroMQ。正如我所看到的,ZeroMQ和ActiveMQ等之间的最大区别是0MQ是无代理的,并且没有内置的消息传递可靠性。如果您正在寻找一种易于使用的,支持许多消息传递模式,传输,平台和语言绑定的消息传递API,那么0MQ绝对值得一看。如果您正在寻找功能完善的消息传递平台,那么0MQ可能不适合您。

有关如何使用0MQ的大量示例,请参见www.zeromq.org/docs:cookbook

我成功使用0MQ在用电量监控应用程序中传递了消息(请参阅http://rwscott.co.uk/2010/06/14/currentcost-envi-cc128-part-1/


14

我正在使用zeroMQ。我想要一个简单的消息传递系统,不需要经纪人的麻烦。我也不需要大型的面向Java的企业系统。

如果您想要一个快速,简单的系统,并且需要支持多种语言(我使用C和.net),那么建议您查看0MQ。


在C / C ++环境中也使用ZMQ。非常快。使用代理模式。非常适合我们的实时VOIP看门狗应用程序,可为kamailio SIP服务器场进行微型pmts。可以肯定的是,我可以使用ZMQ编写一个非常复杂的经纪人,但是会在承诺之前评估一些其他产品。

10

关于ActiveMQ,我只能加上2美分,但这是最受欢迎的一种:

您要使用的语言可能很重要。尽管ActiveMQ确实有大多数客户端,但是与Java库相比,它们的C#实现远非完整。

这意味着某些基本功能是不稳定的(故障切换协议,在某些情况下会失败,没有重新交付支持),而其他功能根本就不存在。由于.NET在项目中似乎并不那么重要,因此开发速度相当缓慢,而且似乎没有任何发布计划。Trunk经常损坏,因此,如果您考虑这一点,那么如果您希望事情继续进行,则可能要考虑为该项目做出贡献。

然后是ActiveMQ本身,它具有很多不错的功能,但也有一些非常奇怪的问题。出于稳定性的原因,我们使用activemq的Fuse(Progress)版本,但是即使如此,您也要记住几个怪异的“ bug”:

  • 在某些情况下停止发送消息的经纪人
  • 日志错误使队列显示不再存在的消息(它们不会传递给使用者,但仍然传递给消费者)
  • 优先级仍未实现(自人类开始以来就在“问题”列表中)
  • 等等等

总而言之,如果您可以忍受它的问题,那将是一个非常不错的产品:

A)使用.NET时不怕积极参与
B)用Java开发;-)


5
次要更新:一段时间以来,KahaDB是ActiveMQ的默认持久性存储。但是:它根本不稳定。在我们的测试中,我们已经看到数据库损坏(有些是可恢复的,有些则花费了我们大约15.000.000消息)注意
Noctris 2011年

8

ZeroMQ实际上有零个队列!这真是一个错误!它没有队列,主题,持久性,什么都没有!它只是套接字API的中间件。如果这是你看起来很酷的话!否则算了!它不像activeMQ或rabbitmq。


8

http://bhavin.directi.com/rabbitmq-vs-apache-activemq-vs-apache-qpid/上提供了RabbitMQ ActiveMQ和QPID的功能和性能比较。

我个人已经尝试了以上三种方法。根据我的观点,RabbitMQ是最好的性能选择,但它没有故障转移和恢复选项。ActiveMQ具有最多的功能,但速度较慢。

更新: HornetQ也是您可以考虑的一个选项,它是JMS Complaint,如果您正在寻找基于JMS的解决方案,它比ActiveMQ更好。


6

我在这里写了有关AMQP,Qpid和ZeroMQ的初步经验:http ://ron.shoutboot.com/2010/09/25/is-ampq-for-you/

我的主观意见是,如果您确实需要持久的消息传递功能,并且不太担心代理可能成为瓶颈,则AMQP很好。另外,AMQP目前缺少C ++客户端(Qpid未能赢得我的支持;但是不确定ActiveMQ客户端),但可能仍在进行中。ZeroMQ可能是其他方式。


6

我已经在生产环境中使用ActiveMQ大约3年了。在完成工作的同时,排队工作正常且无错误的客户端库版本可能是一个问题。目前正在寻求过渡到RabbitMQ。


5

此博客文章的评论中,有一些关于Twitter编写自己的消息队列的讨论,这可能很有趣。

史蒂夫(Steve)对ActiveMQ,RabbitMQ等进行了广泛的负载和压力测试。ActiveMQ实际上非常慢(比Kestrel慢得多),RabbitMQ经常崩溃,生产者太多,消费者也很少。

最初,您可能不会像Twitter那样加载:)



0

Abie,一切都取决于您的用例。不用依赖别人对他们用例的描述,可以将您的用例发布到Rabbitmq-discuss列表中。在Twitter上提问也会得到一些回应。最好的祝福,亚历克西斯


0

关于ZeroMQ,也就是0MQ,您可能已经知道,它是每秒为您提供最多消息的消息(上次我在其参考服务器上每秒获得约400万消息),但正如您可能已经知道的那样,文档不存在。您将很难找到如何启动服务器,更不用说如何使用它们了。我想这就是为什么没有人为0MQ做出贡献的部分原因。

玩得开心!



7
尽管zmq快速且具有简单的api,但请记住这一点:没有持久性,没有事务。没有检测到疲倦或速度慢的消费者(消息只是在没有通知生产者程序的情况下被丢弃)。旁注:zmq是无服务器的,因此您将找不到用于启动服务器的文档。他们确实有一个代理服务器,如果您需要类似的东西。

0

如果您也对商业实现感兴趣,那么应该从my-channels看一下Nirvana 。

Nirvana在金融服务行业中大量用于大型低延迟交易和价格分配平台。

在企业,Web和移动域中支持多种客户端编程语言。

群集功能非常先进,如果透明HA或负载平衡对您很重要,则值得一看。

出于开发目的,可以免费下载Nirvana。


2
本来应该否认这是我的频道员工的晋升。
Schwartz男爵
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.