使用RabbitMQ最大化吞吐量

Cha*_*ing 29 rabbitmq

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

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

在消费者方面,我们使用JAVA客户端从MQ获取任务数据,处理它然后确认.

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

任何评论都非常感谢!!

Rob*_*yes 31

根据我从rabbitmq-discuss邮件组获得的回复,还有其他一些可以尝试增加吞吐量和减少延迟的事情:

  • 使用更大的预取计数.小的价值伤害了表现.

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

  • 确保队列保持简短.较长的队列会产生更多的处理开销.

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

  • 使用HiPE进行实验,这有助于提高性能.

  • 避免交易和持久性.还避免以立即或强制模式发布.避免HA.群集也会影响性能.

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

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

  • 虚拟化可以带来很小的性能损失.

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

  • 不幸的是,很多普遍的噪音和对不相关建议的影响很小。我很惊讶他们没有列出“只发送更少的消息”作为性能提示。如果需要主题队列,则不能使用 direct。增加预取也会显着增加延迟。您必须按照文档和指南为您的情况设置正确的值。多核系统更快?是的,水是湿的。保持队列短?嗯,只是扔掉多余的消息?其中一些只是简单的愚蠢。在大多数应用中,HiPE 将为您带来几乎为零的好处。 (2认同)

Bri*_*lly 29

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

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

如果您真的想深入了解RabbitMQ队列的性能,那么他们的其他博客条目将进一步深入研究数据.

  • 这是流处理,而不是队列。他们应该将其重命名为“RabbitMS”(Rabbit Message Stream)。 (2认同)