使用RabbitMQ最大化吞吐量

使用RabbitMQ最大化吞吐量,rabbitmq,Rabbitmq,在我们的项目中,我们希望在“任务队列”模式中使用RabbitMQ来传递数据 在producer端,我们构建了几个TCP服务器(在node.js中)来recv 高并发数据并将其发送到MQ,而无需执行任何操作 在用户端,我们使用JAVA客户机从中获取任务数据 MQ,处理它,然后确认 因此,问题是: 要获得最大的消息传递吞吐量/性能(例如,400000 msg/秒),最佳队列数是多少?更多的队列是否意味着更好的吞吐量/性能?还有什么我应该注意的吗? 在这种情况下使用RabbitMQ是否有已知的最佳实践

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

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

在用户端,我们使用JAVA客户机从中获取任务数据 MQ,处理它,然后确认

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


非常感谢您的评论

要在RabbitMQ中获得最佳性能,请遵循其创建者的建议。从:

RabbitMQ的队列为空时最快。当队列 空,并且它已经让消费者准备好接收消息,然后尽快 队列接收到消息后,它直接发送到 消费者。对于持久队列中的持久消息,是, 它也将进入磁盘,但这是以异步方式完成的,并且 缓冲能力很强。主要的一点是几乎没有簿记 需要完成的工作是,修改的数据结构很少,而且 几乎不需要分配额外的内存


如果您真的想深入研究RabbitMQ队列的性能,那么这些队列将进一步深入到数据中。

根据我从RabbitMQ讨论邮件组得到的回复,您还可以尝试提高吞吐量和减少延迟:

  • 使用较大的预取计数。小值会影响性能

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

  • 确保排队时间短。更长的队列需要更多的处理 头顶

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

  • 尝试HiPE,这有助于提高性能

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

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

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

  • 虚拟化可能会对性能造成很小的损失

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


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


但是,当然,启用多个标志()的ACK需要消费者应用程序()上的额外逻辑。您必须保留从代理传递的消息的传递标签列表、它们的状态(无论您的应用程序是否处理过它们)以及每个第N个传递标签(NDTAG)的ACK当传递标记小于或等于NDTAG的所有邮件都已被处理时。

主题交换是否较慢,因为交换需要更长的时间来计算它需要向哪个队列发送邮件?不幸的是,大量的一般噪音和对无关建议的低影响。我很惊讶他们没有把“只发送更少的消息”列为性能提示。如果需要主题队列,则不能使用direct。增加预取也会显著增加延迟。您必须按照文档和指南为您的情况设置正确的值。多核系统更快?是的,水是湿的。保持排队时间短?嗯,扔掉多余的信息?其中有些简直是愚蠢。HiPE将在大多数应用程序中为您带来几乎零的好处。对不起,这显然是错误的:“您将通过更大的预取计数来增加吞吐量”。预回迁需要调整,即使这样,它也不是一个常数。文档对此进行了详细说明。@RickO'Shea请仔细阅读问题和答案,然后添加注释。这是流处理,而不是排队。他们应该将其重命名为“RabbitMS”(兔子消息流)。