ActiveMQ或RabbitMQ或ZeroMQ或

我们有兴趣听听ActiveMQ vs RabbitMQ vs ZeroMQ的优缺点。还欢迎提供有关任何其他有趣的消息队列的信息。

488090 次浏览

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

史蒂夫承受了巨大的负荷和压力 ActiveMQ, RabbitMQ等的测试。 ActiveMQ实际上相当慢(非常慢) 比Kestrel慢),RabbitMQ 总是因为太多而崩溃 生产者和消费者太少。

你可能不会有像twitter一样的初始加载:)

比你想知道的更多的信息:

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


更新

只是在详细说明保罗在评论中补充的内容。上述页面在2010年之后就死了,所以阅读时要持保留态度。3年里很多东西都变了。

 Wiki页面历史

阿比,这都取决于你的用例。与其依赖别人对用例的描述,不如自由地将你的用例发布到rabbitmq讨论列表中。在推特上提问也会得到一些回应。祝福你,亚历克西斯

RabbitMQ和activemq# EYZ0之间有一个比较。开箱即用,ActiveMQ被配置为保证消息传递——与不太可靠的消息传递系统相比,这可能会给人一种慢的印象。如果您愿意,可以随时更改性能配置,从而获得至少与其他消息传递系统一样好的性能。至少你还有这个选择。在论坛和ActiveMQ FAQ中有很多关于可伸缩性、性能和高可用性配置的信息。此外,当规范最终确定时,ActiveMQ将支持AMQP 1.0,以及其他有线格式,如STOMP。

ActiveMQ的另一个优点是它是一个Apache项目,所以开发者社区是多样化的——而且它不局限于一家公司。

我只能对ActiveMQ补充我的2分,但由于这是最受欢迎的之一:

你想写的语言可能很重要。虽然ActiveMQ确实有一个客户端,但与Java库相比,他们的c#实现还远远不够完整。

这意味着一些基本功能是不可靠的(故障转移协议……嗯…在某些情况下失败,没有重新交付支持)和其他根本不存在。由于. net对项目似乎不是那么重要,所以开发相当缓慢,似乎也没有任何发布计划。Trunk经常是坏的,所以如果你真的考虑到这一点,如果你想让事情继续下去,你可能会考虑为项目做出贡献。

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

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

总而言之,如果你能接受它的问题,这是一个非常好的产品:

A)不害怕在使用。net时积极参与 B) java开发;-)

我最初的回答非常关注AMQP。我决定重写它,以提供一个更广泛的观点关于这个主题。

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

RabbitMQ是AMQP协议的主要实现之一(还有Apache Qpid)。因此,它实现了一个代理体系结构,这意味着消息在发送到客户机之前在中心节点上排队。这种方法使得RabbitMQ非常易于使用和部署,因为像路由、负载平衡或持久消息队列这样的高级场景只需要几行代码就可以支持。但是,由于中心节点增加了延迟,并且消息信封相当大,因此也降低了可伸缩性和“速度较慢”。

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

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

最后,全部3个产品:

  • 为最常见的语言(c++, Java, .Net, Python, Php, Ruby,…)提供客户端api
  • 有强有力的文档
  • 得到积极支持

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

玩得开心!

很少有应用程序具有ActiveMQ这样多的调优配置。使ActiveMQ脱颖而出的一些特性是:

可配置预取大小。 可配置的线程。 可配置的故障转移。 可配置的管理通知生产者。 ... 细节:< / p >

http://activemq.net/blog # EYZ0 < / p >

如果您也对商业实现感兴趣,您应该看看my-channels中的Nirvana。

Nirvana在金融服务行业中被广泛用于大规模低延迟交易和价格分销平台。

它支持企业、网络和移动领域的各种客户端编程语言。

集群功能非常高级,如果透明的HA或负载平衡对您很重要,那么值得一试。

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

我用的是zeroMQ。我想要一个简单的消息传递系统,我不需要复杂的代理。我也不想要一个巨大的面向Java的企业系统。

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

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

对比了
时RabbitMQ ActiveMQ和QPID的特性和性能 # EYZ0 < / p >

就我个人而言,以上三种方法我都试过了。在我看来,RabbitMQ的性能是最好的,但是它没有故障转移和恢复选项。ActiveMQ拥有最多的特性,但速度较慢。

< p >更新: HornetQ也是一个你可以研究的选项,它是JMS投诉,如果你正在寻找一个基于JMS的解决方案,这是一个比ActiveMQ更好的选择

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

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

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

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

我的主观意见是,如果您确实需要持久消息传递工具,并且不太担心代理可能成为瓶颈,那么AMQP是不错的选择。此外,c++客户端目前缺少AMQP (Qpid没有赢得我的支持;但不确定ActiveMQ客户端),但可能正在进行中。ZeroMQ可能是另一种方式。

这实际上取决于您的用例。

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

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

所以:

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

ZeroMQ是一个面向消息的IPC库。

为什么你错过了麻雀燕八哥红隼Amazon SQSBeanstalkd卡夫卡IronMQ ?

消息队列服务器

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

麻雀

  • 作者:亚历克斯·麦考
  • Sparrow是一个用Ruby编写的轻量级队列,它“讲memcache”

燕八哥

红隼

  • 罗比·波因特著
  • 用Scala编写的Starling克隆(将Starling从Ruby移植到Scala)
  • 队列存储在内存中,但记录在磁盘上

RabbitMQ

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

Apache ActiveMQ

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

Beanstalkd

  • 由Philotic, Inc.编写,以提高Facebook应用程序的响应时间
  • 内存工作队列服务主要是用C语言编写的
  • Docu: # EYZ0

Amazon SQS

卡夫卡

  • 在LinkedIn上用Scala编写
  • LinkedIn用于卸载所有页面和其他视图的处理
  • 默认使用持久化,对热数据使用OS磁盘缓存(启用持久化后吞吐量比上述任何一个都高)
  • 支持在线和离线处理

ZMQ

  • 作为并发框架的套接字库
  • 对于集群产品和超级计算来说,比TCP更快
  • 在inproc, IPC, TCP和组播之间传递消息
  • 通过fanout, pubsub, pipeline, request-reply连接n到n
  • 用于可伸缩的多核消息传递应用程序的异步I/O

EagleMQ

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

IronMQ

  • IronMQ
  • Go语言编写
  • 全管理队列服务
  • 云版本和内部版本都可用
我希望这对我们有帮助。 # EYZ0 < / p >

到目前为止,我已经在生产环境中使用ActiveMQ大约3年了。虽然它完成了工作,但排列正常工作且没有错误的客户端库版本可能是一个问题。我们目前正在考虑过渡到RabbitMQ。