如何使用 AMQP/Node 每秒处理 >100 条消息

How to handle >100 Messages per Second with AMQP/Node

我们目前正在制作一个微服务 (Node v8.3.0) 的原型,它必须每秒消耗 RabbitMQ(RabbitMQ 3.6.12、Erlang 19.2.1)的大约 60-150 条消息。有时它就像一个魅力,队列中没有剩余的消息。但是大多数时候消息卡住了,每秒只有 5-20 条消息得到处理,并且在队列中累积了多达 3M 条消息。

现在我们真的很好奇如何用一个消费者处理所有这些消息。因为已经有一些 Java 消费者在没有任何延迟的情况下处理所有这些消息。我们使用 this node library based on amqplib。此外,处理程序会立即确认传入的消息——业务逻辑是绝对异步的。因此,即使没有任何业务逻辑,它也会卡住。交换器的类型是 topic,不是 durable 并且队列启用了 auto-deleting 功能。我们尝试禁用预取,预取 = 1100,但没有成功。

所以..

1) 您使用哪个 AMQP/RabbitMQ 节点库?
2) 每秒处理多少消息?
3) 还有 improvements/suggestions 吗?

谢谢!

RabbitMQ 团队监控 this mailing list 并且有时只在 Whosebug 上回答问题。

您的 Java 消费者可以正常工作这一事实表明 amqplib-easyamqplib 或您的代码是罪魁祸首。另外,请注意,在 RabbitMQ 中使用单个队列是一种反模式,因为队列是代理中的并发单位。

我已经将 test project 放在一起,其中包括 运行 上的 README 节点消费者和 RabbitMQ PerfTest 应用程序 (Java)。您应该熟悉 PerfTest,因为它提供了许多用于评估环境性能的功能。

在我的测试环境中,我可以轻松维持 4096msg/sec 的发布率。如果我将其增加到 8192,由于 Node 应用程序的消费速度不够快,我可以看到备份的消息。也可以使用 "plain" amqplib 进行比较。