我的第二个消费者没有收到消息

 常见问题解答 > 错误 > 我的第二个消费者没有收到消息

场景

  • 您向队列发送 100 条消息。
  • 启动消费者 A,它接收消息
  • 您启动另一个消费者 B,它没有接收任何消息。
  • 您杀死了 A。
  • 消费者 B 现在接收消息,为什么?

答案

这与预取缓冲区有关。

ActiveMQ Classic 会尝试尽快将一定数量的消息传递给每个消费者,以实现最大吞吐量。这意味着每个消费者通常在 RAM 中有 100-1000 条消息准备处理,这样在消息吞吐量高的时期,就不会出现等待另一条消息到达的延迟。

问题是,如果消费者 A 的预取值设置为 >= 100,那么它将在消费者 B 启动之前接收所有消息。然后,当 B 启动时,实际上没有消息可调度给 B(因为它们都已调度给 A),直到:

  • 新的消息被发送到队列
  • 消费者 A 停止或其 JVM 死亡

解决此问题的方案是将预取值配置为更小的值,例如 1,将消费者同时启动或在消费者启动后发布消息。

您还可以更改调度策略以确保循环调度。

为了帮助诊断这些问题,请尝试使用JMXWeb 控制台

另请参阅

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据Apache 许可证 2.0许可。