我的第二个消费者没有收到消息
常见问题解答 > 错误 > 我的第二个消费者没有收到消息
场景
- 您向队列发送 100 条消息。
- 启动消费者 A,它接收消息
- 您启动另一个消费者 B,它没有接收任何消息。
- 您杀死了 A。
- 消费者 B 现在接收消息,为什么?
答案
这与预取缓冲区有关。
ActiveMQ Classic 会尝试尽快将一定数量的消息传递给每个消费者,以实现最大吞吐量。这意味着每个消费者通常在 RAM 中有 100-1000 条消息准备处理,这样在消息吞吐量高的时期,就不会出现等待另一条消息到达的延迟。
问题是,如果消费者 A 的预取值设置为 >= 100,那么它将在消费者 B 启动之前接收所有消息。然后,当 B 启动时,实际上没有消息可调度给 B(因为它们都已调度给 A),直到:
- 新的消息被发送到队列
- 消费者 A 停止或其 JVM 死亡
解决此问题的方案是将预取值配置为更小的值,例如 1,将消费者同时启动或在消费者启动后发布消息。
您还可以更改调度策略以确保循环调度。