使用RabbitMQ最大化吞吐量

时间:2012-04-05 14:09:44

标签: rabbitmq

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

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

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

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

任何评论都非常感谢!!

3 个答案:

答案 0 :(得分:30)

根据我从rabbitmq-discuss邮件组获得的回复,您还可以尝试提高吞吐量并减少延迟:

  
      
  • 使用更大的预取计数。小的价值会影响表现。

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

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

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

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

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

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

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

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

  •   
  • 调整您的操作系统和网络堆栈。确保你提供的不仅仅是   内存。提供快速核心和RAM。

  •   

答案 1 :(得分:28)

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

  

RabbitMQ的队列在空的时候最快。当队列是   空的,它有消费者准备接收消息,然后尽快   队列接收到一条消息,直接发送到   消费者。对于持久队列中的持久性消息,是的,   它也将转到磁盘,但这是以异步方式完成的   被大量缓冲。重点是很少有簿记   需要完成,很少有数据结构被修改,非常   需要分配额外的内存。

如果你真的想深入研究RabbitMQ队列的性能,那么他们的other blog entry会更深入地进入数据。

答案 2 :(得分:2)

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

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