35

在我们的项目中,我们希望使用“任务队列”模式中的 RabbitMQ 来传递数据。

在生产者端,我们构建了一些 TCP 服务器(在 node.js 中)来接收高并发数据并将其发送到 MQ 而不做任何事情。

在消费者端,我们使用 JAVA 客户端从 MQ 获取任务数据,处理后 ack。

所以问题是:要获得最大的消息传递吞吐量/性能(例如,400,000 msg/second),多少队列最好?更多的队列是否意味着更好的吞吐量/性能?还有什么我应该注意的吗?在这种情况下使用 RabbitMQ 的任何已知最佳实践指南?

任何意见都非常感谢!

4

3 回答 3

37

为了在 RabbitMQ 中获得最佳性能,请遵循其创建者的建议。来自RabbitMQ 博客

RabbitMQ 的队列在为空时最快。当队列是空的,并且它有消费者准备好接收消息时,一旦队列接收到消息,它就会直接发送给消费者。在持久队列中的持久消息的情况下,是的,它也会进入磁盘,但这是以异步方式完成的并且被大量缓冲。要点是需要做的簿记很少,修改的数据结构很少,需要分配的额外内存也很少。

如果你真的想深入研究 RabbitMQ 队列的性能,他们的另一个博客条目会更深入地研究数据。

于 2012-04-06T00:17:06.650 回答
35

根据我曾经从 rabbitmq-discuss 邮件组得到的回复,您可以尝试其他一些方法来增加吞吐量并减少延迟:

  • 使用更大的预取计数。小的值会损害性能。

  • 主题交换比直接交换或扇出交换慢。

  • 确保队列保持较短。更长的队列会带来更多的处理开销。

  • 如果您关心延迟和消息速率,请使用较小的消息。使用有效的格式(例如避免使用 XML)或压缩有效负载。

  • 尝试使用有助于提高性能的 HiPE。

  • 避免事务和持久性。还要避免以立即或强制模式发布。避免 HA。集群也会影响性能。

  • 如果您有多个队列和消费者,您将在多核系统上实现更好的吞吐量。

  • 至少使用 v2.8.1,它引入了流量控制。确保永远不会触发内存和磁盘空间警报。

  • 虚拟化会带来很小的性能损失。

  • 调整您的操作系统和网络堆栈。确保提供足够多的 RAM。提供快速内核和 RAM。

于 2012-08-30T01:44:10.503 回答
2

您将通过更大的预取计数来增加吞吐量,并同时确认来自消费者的多条消息(而不是为每条消息发送 ACK)。

但是,当然,带有多个标志的 ACK ( http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.ack ) 需要您的消费者应用程序 ( http://lists ) 上的额外逻辑.rabbitmq.com/pipermail/rabbitmq-discuss/2013-August/029600.html)。您必须保留从代理传递的消息的传递标记列表、它们的状态(您的应用程序是否已处理它们)以及当所有传递的消息时每第 N 个传递标记 (NDTAG) 确认一次-tag 小于或等于 NDTAG 已被处理。

于 2014-11-04T13:59:31.977 回答