81

ZeroMQ我的应用程序需要高性能消息总线,因此我正在评估RabbitMQ和的性能Apache 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: 接收 10,000 条消息大约需要 1 秒。
  2. ZeroMQ: 接收 10,000 条消息大约需要 15 毫秒。
  3. Qpid: 接收 10,000 条消息大约需要 4 秒。

问题:

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

笔记:

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

4

7 回答 7

108

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

AMQP为速度而设计的(例如,它不会为了路由消息而解包消息),但 ZeroMQ 只是在关键方面设计得更好。例如,它通过在没有代理的情况下连接节点来移除一跳;与任何 AMQP 客户端堆栈相比,它的异步 I/O 性能更好;它进行更积极的消息批处理。构建 ZeroMQ 所花费的时间可能有 60% 用于性能调优。这是非常艰苦的工作。它不是偶然更快。

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

于 2011-10-31T20:37:41.887 回答
33

嗯,当然 ZeroMQ 会更快,它被设计成并且没有其他两个提供的很多基于代理的功能。ZeroMQ 站点对代理与无代理消息传递以及两者的优缺点进行了精彩的比较。

RabbitMQ 博客

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

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

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

于 2011-10-29T08:19:48.540 回答
5

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

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

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

于 2014-11-06T18:31:06.810 回答
3

我已经测试过 c++/qpid

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

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

你在使用持久消息吗?你在解析消息吗?

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

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

于 2011-10-28T18:26:36.630 回答
1

我们在站点http://www.udaparts.com/document/articles/fastsocketpro.htm上将 RabbitMQ 与我们的 SocketPro ( http://www.udaparts.com/ ) 持久消息队列与所有源代码进行了比较。以下是我们为 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 条消息。

于 2014-09-09T00:21:48.300 回答
0

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

于 2011-10-29T23:05:30.617 回答
0

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

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

于 2016-05-13T07:48:41.370 回答