ActiveMQ、RabbitMQ、ZeroMQ是什么?

643

我们很想听听在ActiveMQ、RabbitMQ和ZeroMQ之间使用的经验,包括它们各自的优缺点。如果有关于其他有趣的消息队列的信息也欢迎分享。


2
我对消息队列还不熟悉,正在阅读有关实际用例的更多信息,网址为https://dev59.com/7XNA5IYBdhLWcg3wQ7Uw。后来,在搜索与消息队列(特别是JMS)相关的主题/文章时,我发现了[OpenJMS](http://openjms.sourceforge.net/)-Sun Microsystems的Java消息服务API 1.1规范的开源实现。令我惊讶的是,它在这里没有被涵盖/讨论?我只是想向社区确认OpenJMS是否与此主题/讨论有关,如果是,根据OP的说法,任何有关其优缺点的经验都将有所帮助。 - Gnanam
3
三年后,给浏览这里的人留个提示……思考一下你为什么想要使用消息队列中间件。如果原因是为了在群集中分发任务,请查看Celery。它在比MQ风格的解决方案更高的抽象层级上运行,使用RabbitMQ传递消息,但具有针对任务特定语义的优秀支持。 - Chris Johnson
17个回答

342

编辑:我的初始答案强调了AMQP。我决定重写它,以提供更广泛的视角。

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

RabbitMQ是AMQP协议的主要实现之一(与Apache Qpid一起)。因此,它实现了代理架构,这意味着消息在发送到客户端之前会在中心节点上排队。这种方法使得RabbitMQ非常易于使用和部署,因为只需几行代码就支持高级场景,如路由、负载平衡或持久消息排队。但是,由于中心节点增加了延迟并且消息信封相当大,这也使得它不太可扩展和“较慢”。

ZeroMq是一个非常轻量级的消息传递系统,专门为高吞吐量/低延迟场景设计,例如您可以在金融界找到的场景。Zmq支持许多高级消息传递场景,但与RabbitMQ相反,您将不得不通过组合框架的各个部分(例如:套接字和设备)自己实现大部分功能。Zmq非常灵活,但您必须先学习大约80页的指南(我建议任何编写分布式系统的人都阅读,即使您不使用Zmq),然后才能做比在两个对等方之间发送消息更复杂的事情。

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

最后,所有三个产品:

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

22
虽然正确,但我不确定采用AMQP协议是否与原问题有强烈的相关性。我认为,在选择消息队列时,比起底层的通信协议,还有更重要的考虑因素。 - StaxMan
8
问题没有提到需要使用AMQP,但是这个答案侧重于AMQP。如果我们假设JMS是必需的,则答案基本上相反:ActiveMQ最受欢迎,RabbitMQ有一些应该可以正常工作的支持。如果没有假定任何线路协议:请参阅其他答案。 - Fletch
19
我曾在RabbitMQ和ActiveMQ中工作,我建议你远离ActiveMQ。ActiveMQ的版本非常有问题,我不断遇到机器崩溃和内存泄漏等问题... 而RabbitMQ则很稳定。一旦我安装好它,从来没有再去过管它。它只是按需工作。 如果你愿意,我在我的博客上有一个简单的RabbitMQ教程 http://www.jarloo.com/rabbitmq-c-tutorial/ - Kelly
2
在查看 RabbitMQ 和 ActiveMQ 的工作岗位后,RabbitMQ 似乎更受欢迎。虽然 ActiveMQ 已经存在了很长时间,但雇主们对其的需求并不像 RabbitMQ 那么高。 - user1003932
1
ZMQ的指南也是一本有趣且好读的书 :) - meawoppl
使用强大的Erlang实现,RabbitMQ中央代理节点(实际上是一个概念性的节点)不一定要托管在单个erlang节点或服务器上,而可以是由分布式节点集群支持的(根据您的需要选择性地依赖)负载均衡器。因此,我认为您提到的RMQ代理节点的可扩展性问题是非常误导人的,您应该在那部分进行修订。我的强烈建议是不要仅将RMQ视为一组现成软件,而是作为一组编写良好的工具,可以轻松定制任何类型的MQ需求。 - M N Islam Shihan

174

你为什么错过了SparrowStarlingKestrelAmazon SQSBeanstalkdKafkaIronMQ

消息队列服务器

消息队列服务器可用于各种语言,如Erlang(RabbitMQ)、C(beanstalkd)、Ruby(Starling或Sparrow)、Scala(Kestrel、Kafka)或Java(ActiveMQ)。可以在这里找到简短的概述

Sparrow

  • 由Alex MacCaw编写
  • Sparrow是一个用Ruby编写的轻量级队列,它“说话”memcache

Starling

Kestrel

  • 由Robey Pointer编写
  • Scala中的Starling克隆(从Ruby到Scala的移植)
  • 队列存储在内存中,但记录在磁盘上

RabbitMQ

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

Apache ActiveMQ

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

Beanstalkd

Amazon SQS

Kafka

  • Scala编写,起源于LinkedIn
  • 被LinkedIn用来卸载所有页面和其他视图的处理
  • 默认使用持久化,使用OS磁盘缓存热数据(具有比启用持久性的任何其他选项更高的吞吐量)
  • 支持在线和离线处理

ZMQ

  • 作为并发框架的套接字库
  • 对于集群产品和超级计算机而言,比TCP更快
  • 通过inproc、IPC、TCP和多播传递消息
  • 通过扇出、发布/订阅、管道、请求/响应连接N到N
  • 异步I/O用于可扩展的多核消息传递应用程序

EagleMQ

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

IronMQ

  • IronMQ
  • 用Go编写
  • 完全托管的队列服务
  • 可用作云版本和本地版本

我希望这对我们有所帮助。 来源


你有没有任何想法或评论可以添加到我在这个问题的评论区所提出的问题中 - http://stackoverflow.com/questions/731233/activemq-or-rabbitmq-or-zeromq-or#comment-8527684? - Gnanam
他们有争用管理吗?我在队列系统中总是遇到这个问题。例如,如果队列已满(基于元素数量而不是内存资源),则会阻塞生产者。 - sw.
1
http://queues.io -- 请注意在此处添加缺失的细节。 - asyncwait

82

7
我认为这些人对排队的理解有误——队列不应该是每个用户1个(或更多)。他们应该把工作放在几个队列中,然后为每个用户利用收件箱(或邮箱)。 - Michael Deardeuff
1
Michael,你能再详细解释一下吗?问题出在基于群聊的实时传输。如果我理解正确,你是在谈论将消息作为终点(收件箱)的持久性存储机制?如果是这样,那么它并不符合要求,他们希望聊天能够立即传递,并且客户端直接订阅?据我所知,拥有大量基于主题的队列并不是一个优化的用例? - Josh
1
更新:那个 SecondLife 维基页面是在2009年编写的。到现在的2013年,由于所有消息队列的持续改进,他们调查的许多特定点已不再适用。他们测试的大多数或全部 MQ 在某种意义上都已经更好了。 - Paul Legato

71

这真的取决于您的使用情况。

将0MQ与ActiveMQ或RabbitMQ进行比较是不公平的。ActiveMQ和RabbitMQ是消息系统,需要安装和管理。它们在功能方面比ZeroMQ提供了更多,例如具有真正的持久队列、事务支持等等。

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

所以:

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

ZeroMQ是面向消息的IPC库。


7
你可以使用多个。http://www.rabbitmq.com/blog/2010/10/18/rabbitmq0mq-bridge/讲解了如何使用0MQ来连接多个RabbitMQ代理商并创建松散耦合的联邦。 - Michael Dillon

34

这里有一篇RabbitMQ和ActiveMQ的比较文章点击这里。默认情况下,ActiveMQ被配置为保证消息传递的可靠性 - 这可能会给人留下它比不那么可靠的消息系统慢的印象。如果您愿意,您总是可以更改配置以获得至少与任何其他消息系统一样好的性能,并且您至少有这个选项。关于扩展、性能和高可用性方面的配置,ActiveMQ论坛和FAQ中有大量信息。此外,当规范最终确定时,ActiveMQ将支持AMQP 1.0,以及其他线路格式(如STOMP)。

ActiveMQ的另一个优点是它是一个Apache项目,因此开发者社区多样化,而且它不受任何一家公司的约束。


22

我没有使用过ActiveMQ或RabbitMQ,但使用了ZeroMQ。据我所知,ZeroMQ和ActiveMQ等的最大区别在于0MQ没有代理(brokerless),也没有内置的消息传递可靠性。如果你正在寻找一个易于使用的消息API,支持许多消息模式、传输、平台和语言绑定,则0MQ绝对值得一看。如果你正在寻找一个完整的消息平台,那么0MQ可能不太合适。

请参阅www.zeromq.org/docs:cookbook,了解0MQ的用法示例。

我成功地在用电监测应用程序中使用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服务器群进行微支付。我相信我可以编写一个非常复杂的代理程序来使用ZMQ,但在承诺之前会评估一些其他产品。 - user1899861

10

关于ActiveMQ,我只能提供一些个人意见,但它是其中最受欢迎的之一:

你想要使用的编程语言可能很重要。尽管ActiveMQ为大多数语言都提供了客户端,但与Java库相比,它们的C#实现还不完整。

这意味着一些基本功能可能有问题(故障转移协议在某些情况下失效,没有重新传递支持),而其他功能则根本不存在。由于.NET似乎对该项目并不那么重要,因此开发速度相对较慢,也没有发布计划。主干代码库经常出现问题,因此如果您考虑使用此产品,则可能需要考虑参与项目贡献以推进事务的进展。

然后还有ActiveMQ本身,它拥有许多很好的功能,但也存在一些非常奇怪的问题。我们出于稳定性原因使用Fuse(Progress)版本的activemq,但即使如此,仍有一些奇怪的“错误”需要记住:

  • 在某些情况下会停止发送消息的代理
  • 日志错误会导致队列显示不再存在的消息(它们不会被传递给消费者,但仍然存在)
  • 优先级仍未实现(自人类诞生以来就在问题列表中)
  • 等等等等

总的来说,如果您能接受它的问题,这是一个相当不错的产品:

A)如果使用.NET时敢于积极参与
B)使用Java开发 ;-)


5
小更新:最近一段时间以来,KahaDB已成为ActiveMQ默认的持久化存储。然而,需要注意的是:它并不稳定。在我们的测试中,我们发现了数据库损坏的情况(有些可以恢复,但有些却导致我们损失大约15,000,000条消息)。请注意这一点。 - Noctris

8

ZeroMQ真的没有队列!这是一个真正的误解!它没有队列、主题、持久性,什么都没有!它只是一种用于套接字API的中间件。如果这正是你所追求的酷炫特性,那就使用它吧!否则,请忘记它!它不像ActiveMQ或RabbitMQ。


8
在这里有一份RabbitMQ、ActiveMQ和QPID的特性和性能比较:http://bhavin.directi.com/rabbitmq-vs-apache-activemq-vs-apache-qpid/。我个人尝试过以上三种,我认为在性能方面RabbitMQ最好,但它没有故障转移和恢复选项。ActiveMQ拥有最多的功能,但速度较慢。
更新:你还可以看一下HornetQ:http://www.jboss.org/hornetq,它是JMS Complaint的,如果你正在寻找基于JMS的解决方案,那么它是比ActiveMQ更好的选择。

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