ZeroMQ,RabbitMQ和Apache Qpid的性能比较

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

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

  1. RabbitMQ :我使用了“扇出”types的交换和一个默认configuration的队列。 我使用了RabbitMQ C客户端库。
  2. ZeroMQ :我的发布者使用ZMQ_PUSH套接字发布到tcp://localhost:port1 ,我的代理在tcp://localhost:port1上侦听,然后将消息重新发送到tcp:// localhost:port2,我的使用者在tcp://localhost:port2上侦听tcp://localhost:port2使用ZMQ_PULL套接字。 我在ZeroMQ使用一个代理而不是点对点通信的代理来使性能比较对使用代理的其他消息队列实现公平。
  3. Qpid C ++消息代理:我使用了“扇出”types的交换和一个默认configuration的队列。 我使用了Qpid C ++客户端库。

以下是性能结果:

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

问题:

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

注意:

testing是在两台分配的处理器的虚拟机上完成的。 结果可能因硬件而异,但我主要关注MQ产品的相对性能。

RabbitMQ可能对这些消息进行持久化。 我认为你需要在消息中设置消息的优先级或其他选项,而不是持久化。 那么性能将提高10倍。 您应该期望通过AMQP代理至less10万条消息/秒。 在OpenAMQ中,我们获得的性能高达300K信息/秒。

AMQP 为速度devise的(例如,它不会将消息解包以便路由),但ZeroMQ只是在关键方面更好地devise的。 例如,通过连接没有代理的节点来删除一跳; 它比任何AMQP客户端堆栈都有更好的asynchronousI / O; 它做更积极的消息批处理。 也许60%的时间用于构buildZeroMQ进行性能调优。 这是非常艰苦的工作。 这不是偶然的。

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

嗯,当然ZeroMQ会更快,它被devise成没有很多其他两个提供的基于经纪人的function。 ZeroMQ网站对经纪人和无代理人的消息进行了精彩的比较,以及两者的缺点和优点。

RabbitMQ博客 :

RabbitMQ和0MQ侧重于消息的不同方面。 0MQ更加关注消息如何通过线路传输。 另一方面,RabbitMQ专注于消息的存储,过滤和监控。

(我也喜欢上面的RabbitMQpost,因为它也讨论了在RabbitMQ中使用ZeroMQ)

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

我在ZeroMQ中使用一个代理而不是点对点通信的代理来使性能比较对使用代理的其他消息队列实现公平。

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

我也很怀疑在虚拟机上运行基准testing – 有很多额外的层次可能会影响结果的方式不明显。 (除非你打算在虚拟机上运行真正的系统,当然,在这种情况下,这是一个非常有效的方法)。

我testing过c ++ / qpid

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

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

你使用持久性消息吗? 你parsing的消息?

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

如果代理主要是空闲的,你可能还没有configuration发送者和接收者的预取。 发送很多消息是非常重要的。

我们将RabbitMQ与http://www.proaparts.com/document/articles/fastsocketpro.htm的SocketPro(; http://www.udaparts.com/ )持久性消息队列与所有源代码进行了比较。 以下是我们为RabbitMQ获得的结果:

同机入队和出队:

“你好,世界” –
排队:每秒30000条消息;
出队:每秒7000条消息。

文本与1024字节 –
排队:每秒11000条消息;
出队:每秒7000条消息。

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

networking带宽跨机器入队和出队100 mbps:

“你好,世界” –
排队:每秒28000条消息;
出队:每秒1900条消息。

文本与1024字节 –
排队:每秒8000条消息;
出队:每秒1000条消息。

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

尝试在发送者和接收器上configuration一个像100那样的预取。仅仅预先发送发送者是不够的

我们已经开发了一个build立在ZeroMQ之上的开源消息总线 – 我们最初是这样来取代Qpid的。 它是无代理的,所以它是一个完全公平的比较,但它提供了与代理解决scheme相同的function。

我们的标题性能数字是两台机器之间的每秒140K信息,但您可以在这里看到更多的细节: https : //github.com/Abc-Arbitrage/Zebus/wiki/Performance

我想如果你使用芹菜,Rabbitmq的performance会提高