ZeroMQ,RabbitMQ和Apache Qpid之间的性能比较


78

我需要一个高性能的消息总线为我的应用程序,所以我评估性能ZeroMQRabbitMQApache Qpid。为了衡量性能,我正在运行一个测试程序,该程序使用消息队列实现之一发布10,000条消息,并在同一台计算机上运行另一个进程以消耗这10,000条消息。然后,我记录发布的第一条消息和收到的最后一条消息之间的时间差。

以下是我用于比较的设置。

  1. RabbitMQ:我使用了“扇出”类型交换和默认配置的队列。我使用RabbitMQ C客户端库。
  2. ZeroMQ:我的发布者tcp://localhost:port1使用ZMQ_PUSH套接字发布,我的代理侦听tcp://localhost:port1并将消息重新发送到tcp:// localhost:port2,而我的使用者tcp://localhost:port2使用ZMQ_PULL套接字侦听。我正在使用代理而不是对等通信,ZeroMQ以使性能比较与使用代理的其他消息队列实现公平。
  3. QpidC ++消息代理:我使用“扇出”类型交换和默认配置的队列。我使用了Qpid C ++客户端库。

以下是性能结果:

  1. RabbitMQ:大约需要1秒才能收到10,000条消息。
  2. ZeroMQ:大约需要15毫秒来接收10,000条消息。
  3. Qpid:大约需要4秒钟才能收到10,000条消息。

问题:

  1. 是否有人在消息队列之间运行类似的性能比较?然后,我想将我的结果与您的结果进行比较。
  2. 有什么方法可以调整RabbitMQQpid使其性能更好?

注意:

测试是在具有两个分配处理器的虚拟机上完成的。结果因不同的硬件而异,但是我主要对MQ产品的相对性能感兴趣。


3
我几个月前进行了简单的测试,结果相似。而且我注意到,在使用RabbitMQ或Qpid时,该系统非常空闲。我认为一定有问题。
加里·施

“ RabbitMQ:大约需要12秒才能收到10,000条消息。” -在我们自己的测试中,我们通常会看到每个CPU每秒有20-25,000的进入速度。因此,您做错了事,或使用了速度慢的客户端。您是否尝试通过电子邮件向rabbitmq-discuss发送问题?

1
这里有一个很好的比较,日2013年4月10日:x-aeon.com/wp/2013/04/10/...
Daniel F

3
RabbitMQ,Kafka,HornetQ,ActiveMQ,SQS和Mongo性能比较的更新版本现在在这里:softwaremill.com/mqperf
adamw

2
测试时每个消息有多少字节?
阿森纳2015年

Answers:


102

RabbitMQ可能正在对这些消息进行持久化。我认为您需要设置消息优先级或消息中的其他选项以不进行持久性处理。然后性能将提高10倍。您应该期望通过AMQP代理至少每秒10万条消息。在OpenAMQ中,我们的性能高达每秒30万条消息。

AMQP原专为提高速度设计(例如,它不对消息进行拆包以进行路由),但是ZeroMQ只是在关键方面进行了更好的设计。例如,它通过连接没有代理的节点来消除跃点;它比任何AMQP客户端堆栈都有更好的异步I / O;它执行更积极的消息批处理。可能花费60%的时间来构建ZeroMQ来进行性能调整。这是非常艰苦的工作。这不是偶然造成的。

我想做的一件事,但太忙了,是在ZeroMQ之上重新创建一个类似AMQP的代理。这里有第一层:http : //rfc.zeromq.org/spec:15。整个堆栈的工作方式类似于RestMS,将传输和语义分为两层。它会提供与AMQP / 0.9.1几乎相同的功能(并且在语义上可以互操作),但速度要快得多。


我们将继续使用rabbitmq,直到有人提出比@pieter btw更好的解决方案。它使我想起了伟大的专利故事[1]。[1] youtube.com/watch?v=5QqbDyZ8Eu4
Kunthar,2016年

55
RIP伙伴,您构建了一些很棒的东西
Gillespie

33

嗯,ZeroMQ当然会更快,它被设计为并且没有其他两个提供的很多基于代理的功能。该ZeroMQ网站有券商VS brokerless消息和缺点都与优势美妙的对比。

RabbitMQ博客

RabbitMQ和0MQ专注于消息传递的不同方面。0MQ更加关注消息如何通过网络传输。另一方面,RabbitMQ专注于如何存储,过滤和监视消息。

(我也喜欢上面的RabbitMQ帖子,因为它也谈到了将ZeroMQ与RabbitMQ结合使用)

因此,我想说的是,您应该决定最适合您要求的技术。如果唯一的要求是速度,请选择ZeroMQ。但是,如果您还需要其他方面的信息,例如消息的持久性,过滤,监视,故障转移等,那么您就需要开始考虑RabbitMQ和Qpid。


4
ZeroMQ没有经纪人。您将代理设计为应用程序整体设计的一部分,并且代理侦听零级队列,并根据目的地将消息路由。ZeroMQ仅完成一项工作,并且做得很好:消息排队。这里有Malamute,这是ZeroMQ员工为ZeroMQ设计的经纪人实现,但是它不是ZeroMQ的一部分。您可以将它与ZeroMQ一起安装在自己的过程中,也可以安装在专门用于消息代理的单独盒子上。这是它自己的项目。github.com/zeromq/malamute
Neil Davis

是的,我说它没有经纪人,并且链接到经纪人vs无经纪人中的文章。不清楚吗?此外,当我在2011年发布此答案时,没有雪橇犬出现在2014
史蒂夫·凯西

4

我正在使用代理而不是ZeroMQ中的对等通信,以使性能比较与使用代理的其他消息队列实现公平。

不确定为什么要这么做-如果您唯一关心的是性能,则无需进行公平竞争。如果您不关心持久性,过滤等问题,那为什么要付出代价呢?

我对在VM上运行基准测试也非常不满意-有很多额外的层会以不明显的方式影响结果。(当然,除非您计划在VM上运行真实系统,否则在这种情况下这是非常有效的方法)。


3

我已经测试过c ++ / qpid

我长时间在两台不同的计算机之间每秒发送50000条消息,而且没有排队。

我没有使用扇出,只是一个简单的交换(非持久性消息)

您是否正在使用持久消息?您在解析消息吗?

我想没有,因为0MQ没有消息结构。

如果代理主要是空闲的,则可能尚未在发送者和接收者上配置预取。这对于发送许多消息非常重要。


我使用的是非持久队列,我没有解析消息,实际上,我正在使用相同的代码为所有三个队列实验生成消息。将交换类型更改为直接对性能没有影响。同样在使用发送方流控制(api sender.SetCapaclity(8))之后,计时变得更糟。如果没有发送方流控制,队列似乎将无限增长。在测量时间时,您是否等到接收到所有消息并且队列已完全耗尽?
ahsankhan 2011年

1
我发现qpid-perftest程序正在使用Qpid的“旧消息Apis”。在我的测试中,切换到旧的Apis可以使性能提高10倍。
ahsankhan 2011年

1

我们比较了我们的SocketPro(RabbitMQ的http://www.udaparts.com/)在现场持久消息队列http://www.udaparts.com/document/articles/fastsocketpro.htm所有的源代码。这是我们从RabbitMQ获得的结果:

同一机器入队和出队:

“ Hello world”-入队
:每秒30000条消息;
出队:每秒7000条消息。

带有1024个字节的文本-入队
:每秒11000条消息;
出队:每秒7000条消息。

10 * 1024字节的文本-入队
:每秒4000条消息;
出队:每秒4000条消息。

跨机器入队和出队,网络带宽为100 mbps:

“ Hello world”-入队
:每秒28000条消息;
出队:每秒1900条消息。

带有1024个字节的文本-入队
:每秒8000条消息;
出队:每秒1000条消息。

10 * 1024字节的文本-入队
:每秒800条消息;
出队:每秒700条消息。


0

尝试在发件人和收件人上配置预取值,例如100。仅预取发件人是不够的


对于qpid,我的印象是Receiver.setCapacity(100)设置了接收器的预取。这样做之后,使用“新的qpid api”使代码的性能提高了10倍,并且性能达到了与Qpid旧消息传递Api相似的水平。我已经用结果更新了帖子。但是,Qpid似乎仍然比rabbitmq慢4倍。
2011年

0

我们已经开发了一个基于ZeroMQ的开源消息总线-最初是为了取代Qpid而这样做的。它是无代理的,因此并不是完全公平的比较,但是它提供了与代理解决方案相同的功能。

我们的主要性能指标是两台机器之间每秒140K msgs,但您可以在此处查看更多详细信息:https : //github.com/Abc-Arbitrage/Zebus/wiki/Performance

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.