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

ahs*_*han 76 message-queue rabbitmq zeromq qpid

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

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

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

以下是效果结果:

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

问题:

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

注意:

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

Pie*_*ens 93

RabbitMQ可能正在对这些消息进行持久化.我认为您需要在消息中设置消息优先级或其他选项以不执行持久性.性能将提高10倍.您应该期望通过AMQP经纪人至少100K消息/秒.在OpenAMQ中,我们获得了高达300K消息/秒的性能.

AMQP 为速度设计的(例如,它不会解压缩消息以便路由它们),但ZeroMQ只是以关键方式设计得更好.例如,它通过连接没有代理的节点来删除一跳; 它比任何AMQP客户端堆栈都有更好的异步I/O; 它做了更积极的消息批处理.也许60%的时间用于构建ZeroMQ进入性能调优.这是非常艰苦的工作.事故并不快.

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

  • RIP伴侣,你建立了一些很棒的东西 (41认同)

Ste*_*sey 33

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

RabbitMQ博客:

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

(我也喜欢上面的RabbitMQ帖子,因为它也讨论了使用ZeroMQ和RabbitMQ)

所以,我想说的是你应该决定最符合你要求的技术.如果唯一的要求是速度,ZeroMQ.但是如果您需要其他方面,例如消息的持久性,过滤,监控,故障转移等等,那么当您需要开始考虑RabbitMQ和Qpid时.

  • ZeroMQ没有经纪人.您将代理设计为应用程序整体设计的一部分,并且代理侦听zeromq,根据目标路由消息.ZeroMQ只做一项工作而且做得很好:消息排队.有Malamute,这是ZeroMQ人员为ZeroMQ设计的经纪人实现,但它不是开箱即用的ZeroMQ的一部分.这是一项服务,您可以将ZeroMQ与ZeroMQ一起安装在自己的流程中,也可以安装在专门用于消息代理的单独的盒子上.这是它自己的项目.https://github.com/zeromq/malamute (4认同)

Wal*_*rog 5

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

不知道你为什么要这样做——如果你唯一关心的是性能,那么就没有必要让比赛场地变得平坦。如果你不关心持久性、过滤等,那为什么要付出代价呢?

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


小智 3

我测试过 c++/qpid

我在两台不同的机器之间每秒发送 50000 条消息,很长一段时间没有排队。

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

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

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

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