
问题现象描述
在使用activemq artemis 2.22.0版本构建的集群环境中,部分用户可能会遇到一个棘手的问题:集群内部桥接队列$.artemis.internal.sf会随机出现消息堆积。尽管其他业务队列的消息能够正常接收和消费,甚至在高负载下也能表现良好,但这个内部桥接队列的消息却仿佛“卡住”了一般,持续增长。这种堆积现象并非总在系统高负载时发生,也与实例的运行时间没有必然联系,表现出偶发性和难以复现的特点,给故障排查带来了极大挑战。当消息堆积发生时,通常需要手动重启相关实例才能恢复桥接消费,这严重影响了服务的稳定性和可用性。
典型的集群配置可能涉及多层集群(例如“表面”层和“深度”层),每层包含多个子集群,每个子集群由主备节点对组成,通过cluster-connections进行互联。例如:
connector-D1-master-a 1000 20001 -1 1 true ON_DEMAND 1 2000 2 connector-D1-slave-a connector-D1-master-b connector-D1-slave-b
在此类复杂配置下,即使日志显示桥接连接正常,且没有观察到连接重试等异常,消息堆积依然可能发生。
根本原因分析
该问题的核心在于ActiveMQ Artemis 2.22.0版本中引入的两个变化及一个未修复的缺陷的组合作用:
producer-window-size 默认值变更 (ARTEMIS-3805): 在ActiveMQ Artemis 2.22.0版本之前,cluster-connection的producer-window-size默认值为-1,表示无限制的生产者窗口大小。然而,从2.22.0版本开始,此默认值被修改为1048576字节(即1MiB)。这意味着集群桥接在向对端发送消息时,会受到1MiB的流量控制限制。虽然此变更在文档的“Clusters”章节有所提及,但在“Configuration Index”章节中可能存在遗漏,导致用户不易察觉。
流控缺陷 (ARTEMIS-4003): ActiveMQ Artemis 2.22.0版本中存在一个未知的流控(flow-control)缺陷。当集群桥接在节点间传输大消息时,这个缺陷可能导致桥接内部逻辑卡住,进而阻止消息的进一步传输,即使producer-window-size被设置为有限值。这个缺陷直到2.26.0版本才通过ARTEMIS-4003得到解决。
因此,在ActiveMQ Artemis 2.22.0版本中,有限的producer-window-size(1MiB)与处理大消息时的流控缺陷相结合,导致了$.artemis.internal.sf队列消息的随机堆积。
解决方案
针对此问题,有两种主要且有效的解决方案:
方案一:调整 producer-window-size 配置
在不升级ActiveMQ Artemis版本的情况下,可以通过显式地将cluster-connection的producer-window-size设置为-1来解决此问题。这将恢复到2.22.0版本之前的无限制生产者窗口行为,从而绕过因有限窗口大小与流控缺陷结合而引发的问题。
操作步骤:
- 编辑您的broker.xml配置文件。
- 在所有相关的
配置块中,添加或修改 标签,将其值设置为-1。
示例代码:
-1
注意事项:
- 将producer-window-size设置为-1意味着桥接将不再受限于生产者窗口大小。在极端情况下,如果发送方速度远超接收方,这可能导致发送方节点积累更多待发送消息,占用更多内存。然而,对于解决此特定问题,这是目前最直接且有效的方法。
- 修改配置后,需要重启ActiveMQ Artemis实例以使配置生效。
方案二:升级 ActiveMQ Artemis 版本
最彻底的解决方案是升级ActiveMQ Artemis到2.26.0或更高版本。2.26.0版本包含了对ARTEMIS-4003缺陷的修复,彻底解决了流控相关的问题,即使producer-window-size保持默认值(1MiB),也不会再出现因流控导致的桥接卡死。
操作步骤:
- 规划升级路径,参考ActiveMQ Artemis官方文档进行版本升级。
- 将ActiveMQ Artemis的运行时版本更新至2.26.0或更高版本。
- 升级后,无需修改producer-window-size配置,因为底层缺陷已被修复。
注意事项:
- 版本升级是重要的操作,务必在测试环境中充分验证,确保与现有应用程序和配置的兼容性。
- 建议升级到当前最新的稳定版本,以获得最新的功能和错误修复。
总结与建议
ActiveMQ Artemis 2.22.0版本中$.artemis.internal.sf桥接队列的消息堆积问题,是producer-window-size默认值变更与流控缺陷共同作用的结果。解决此问题的关键在于解除或修复导致流控异常的机制。
推荐的解决方案是升级到ActiveMQ Artemis 2.26.0或更高版本,因为这从根本上解决了流控缺陷,提供了最稳定的长期解决方案。如果暂时无法进行版本升级,那么将producer-window-size设置为-1是一个有效的临时缓解措施。
无论选择哪种方案,都应在非生产环境中进行充分的测试,并密切监控系统性能和桥接队列的状态,以确保集群的稳定运行。同时,持续关注ActiveMQ Artemis的官方发布和更新,及时获取最新的修复和优化。








