【发布时间】:2014-07-11 17:25:24
【问题描述】:
我正在寻求有关一个奇怪问题的帮助,即队列中的慢速消费者会导致同一队列中的所有其他消费者开始以 30 秒的间隔消费消息。这就是所有消费者,但速度慢的消费者不会尽可能快地消费消息,而是在消费前等待一些神奇的 30 秒障碍。
我的应用程序的基本流程是这样的:
- 许多生产者将消息放置到单个队列中。消息可以有不同的 JMSXGroupID
- 许多消费者在单个队列上收听消息
- 作为标准做法,JMSXGroupID 分布在消费者之间
- 在某些时候,其中一个消费者变得很慢,无法快速处理消息
- 缓慢的消费者最终填充了代理上的预取缓冲区,AMQ 认识到它很慢(默认行为)
- 在那一点 - 或者某个“随机”但稍后关闭 - 除了慢速消费者之外的所有消费者都开始仅以相同的 30 秒间隔消费消息
- 如果缓慢的消费者再次变得快速,那么事情很快就会恢复正常运行,30 秒的障碍就会消失
我不知道是什么原因导致了这个问题,或者如何解决它,请帮忙。
更多背景和发现
- 我已经成功地在 AMQ 5.8.0、5.9.0(最初发现问题的地方)和 5.9.1、全新安装和现有的操作管理安装以及不同的机器上可靠地重现了这个问题,一些 vm 和有些不是。所有 linux 安装、不同的操作系统和 java 版本。
- 它似乎不受任何与预取相关的影响,即:将预取值从 1 更改为 10 到 1000 并没有阻止问题的发生
- [red herring?] 在 amq 实例上启用调试日志会显示与定期检查可能过期的消息相关的日志。队列没有过期策略,所以我只能认为预定的
expireMessagesPeriod时间只是唤醒 amq,然后它会向非慢速消费者发送消息。 - 如果进入 30 秒模式,然后左转,然后再次进入,则分钟后的秒数始终相同,例如分钟后的 14 秒和 44 秒。这适用于所有消费者和托管这些消费者的所有机器。重新启动 amq 后,这些障碍点确实会发生变化。
【问题讨论】:
-
创建一个单元测试并为 ActiveMQ 的问题打开一个 Jira
-
OK 就可以了。我认为这不是预期的行为吗?
-
issues.apache.org/jira/browse/AMQ-5200 - 创建此票证以涵盖这种确切情况(即使用组而不是选择器),以防它被认为比修复替代情况更重要
标签: performance jms activemq