使用RabbitMQ最大限度地提高吞吐量



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

在生产者端,我们构建了一些TCP服务器(在node.js中)来recv高并发数据,并将其发送到MQ,而无需执行任何操作。

在消费者端,我们使用JAVA客户端从MQ,处理它,然后确认。

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

非常感谢任何评论!!

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

RabbitMQ的队列为空时速度最快。当队列空,并且它让消费者准备好接收消息,然后尽快队列收到一条消息,它会直接发送到消费者在持久队列中的持久消息的情况下,它也将进入磁盘,但这是以异步方式完成的,并且缓冲很重。重点是很少记账需要完成,修改的数据结构很少几乎不需要分配额外的内存。

如果您真的想深入研究RabbitMQ队列的性能,那么他们的另一个博客条目将深入研究数据。

根据我曾经从rabbitmqdiscuss邮件组得到的回复,你可以尝试增加吞吐量和减少延迟:

  • 使用较大的预取计数。价值太小会影响绩效。

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

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

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

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

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

  • 如果您拥有多个队列和消费者。

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

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

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

您将通过更大的预取计数来提高吞吐量,同时确认来自消费者的多条消息(而不是为每条消息发送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)。您必须保留从代理传递的消息的传递标签列表、它们的状态(无论您的应用程序是否处理过它们),以及在处理完传递标签小于或等于NDTAG的所有消息时,确认第N个传递标签(NDTAG)。

最新更新