当前位置 : 首页 » 互动问答 » 正文

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

分类 : 互动问答 | 发布时间 : 2011-10-28 03:34:20 | 评论 : 8 | 浏览 : 79080 | 喜欢 : 68

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

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

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

以下是性能结果:

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

Questions:

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

Note:

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

回答(8)

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

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

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

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

    RabbitMQ博客:

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

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

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

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

    不确定为什么要这样做 - 如果你唯一关心的事情是表现,没有必要使比赛场地水平。如果您不关心持久性,过滤等,那么为什么要付出代价呢?

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

  • 4楼
  • 我已经测试了c ++ / qpid

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

    我没有使用扇出,只是一个简单的交换(非持久性消息)<notranslate >您使用的是持久性消息吗? 你在解析消息吗?

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

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

    If the broker is mainly idle, you probably haven't configured the prefetch on sender and receptor. This is very important to send many messages.

  • 5楼
  • 我们将RabbitMQ与站点 http://www.udaparts.com/ 上的SocketPro( 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条消息。

  • 6楼
  • 尝试使用类似100的值配置发送方和接收方的预取。仅仅预取发送方是不够的

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

    我们的标题性能数字是两台机器之间每秒140K msgs,但你可以在这里看到更多细节: https:// github。 COM / ABC套利/瘤牛/维基/性能

  • 8楼
  • 我想如果你使用芹菜,Rabbitmq的表现会有所改善

相关阅读:

ActiveMQ or RabbitMQ or ZeroMQ or

ActiveMQ or RabbitMQ or ZeroMQ or

ActiveMQ or RabbitMQ or ZeroMQ or

全新安装后无法访问RabbitMQ Web管理界面

消息队列与Web服务?

真实世界使用JMS /消息队列?

RabbitMQ - 如何从单个队列中删除所有消息

从RabbitMQ中删除所有队列?

RabbitMQ使用哪些端口?

找不到元素'beans'的声明