我们目前正在设计一个微服务(Node v8.3.0)原型,该服务每秒必须消耗 RabbitMQ(RabbitMQ 3.6.12、Erlang 19.2.1)约 60-150 条消息。有时它就像一个魅力,队列中没有剩余的消息。但大多数情况下,消息会卡住,每秒仅处理 5-20 条消息,并且队列中会累积多达 3M 条消息。
现在我们真的很好奇如何用单个消费者处理所有这些消息。因为已经有一些 Java 消费者在没有任何延迟的情况下处理所有这些消息。我们使用基于 amqplib 的这个节点库。此外,处理程序立即确认传入的消息 - 业务逻辑是绝对异步的。因此,即使没有任何业务逻辑,它也会卡住。交换器的类型是
topic
,它不是 durable
并且队列启用了 auto-deleting
功能。我们尝试禁用预取,预取 = 1
和 100
,但没有成功。
所以..
1)您使用哪个 AMQP/RabbitMQ 节点库?
2) 每秒处理多少条消息?
3)还有什么进一步的改进/建议?
谢谢!
事实上,您有一个可以正常工作的 Java 使用者,这表明
amqplib-easy
、amqplib
或您的代码是罪魁祸首。另请注意,在 RabbitMQ 中使用单个队列是一种反模式,因为队列是代理中的并发单位。
我已经整理了一个测试项目,其中包括使用RabbitMQ PerfTest应用程序(Java)运行节点消费者的
README
。您应该熟悉 PerfTest,因为它提供了许多用于评估环境性能的功能。
在我的测试环境中,我可以轻松维持
4096
消息/秒的发布速率。如果我将其增加到8192
,我可以看到消息备份,因为 Node 应用程序的消耗速度不够快。使用“普通”进行比较也会很有趣amqplib
。