ActiveMQ Artemis双节点集群单向消息分发故障求助
环境信息
- OS: Ubuntu 20.04
- ActiveMQ Artemis: 2.25.0
- Java: OpenJDK 11.0.16
问题现象
搭建了由broker_1064和broker_1164组成的双节点集群,编写Producer与Consumer程序测试跨节点消息收发:
- Producer向broker_1064的
mdms.lpi.test_it队列发送测试消息,Consumer从broker_1164的同队列消费 - 反向场景:Producer向broker_1164的同队列发消息,Consumer从broker_1064的队列消费
测试前会清理对应队列。
测试初期双向收发均正常,但运行1至数小时后突然出现单向失效:
- 仅
Producer→broker_1064→broker_1164→Consumer路径正常 Producer→broker_1164→broker_1064→Consumer路径无消息,两台broker的该队列消息数均为0,其他队列也存在相同问题。
额外测试结果:
- 手动向broker_1164的该队列发送3条消息,broker_1064队列消息数为0
- 启动broker_1064上的Consumer后,broker_1164队列消息数变为0、已确认数为3,但Consumer未收到消息。
当前临时恢复方式:清理一台broker的数据目录并重启可恢复双向通信,且artemis.log无异常日志。集群通过相同命令创建(仅IP和broker名称不同),使用统一的broker.xml配置。
排查及解决建议
- 检查集群节点连通性
- 执行
artemis cluster list命令,确认两台broker的集群节点状态,验证broker_1164与broker_1064是否能互相感知。若出现节点失联,排查网络防火墙、端口是否存在间歇性阻断,或集群心跳配置是否合理。
- 执行
- 验证集群转发配置
- 核对
broker.xml中的cluster-connections配置,确保双向集群连接的connector-ref和static-connectors指向正确,无单向配置遗漏。 - 检查队列的
cluster属性是否开启,确认转发规则双向生效,避免出现仅单方向配置转发的情况。
- 核对
- 分析持久化存储
- 使用
artemis data print命令分析broker数据目录下的journal文件,查看是否存在未处理的消息记录或异常条目,排查存储层潜在损坏问题。 - 临时更换持久化类型(如从journal切换为JDBC),验证是否为存储引擎导致的单向转发失效。
- 使用
- 开启调试日志
- 修改
logging.properties,将org.apache.activemq.artemis.core.server.cluster和org.apache.activemq.artemis.core.server.forwarding的日志级别设为DEBUG,重新运行测试,捕捉失效过程中的隐藏异常。
- 修改
- 检查客户端配置
- 确认Consumer的连接地址是否配置了集群或故障转移地址,避免仅绑定单节点导致无法接收跨节点消息。
- 验证Producer的消息确认机制,确保消息确实被broker_1164接收并持久化,而非仅发送成功但未触发转发。
- 升级版本验证
- ActiveMQ Artemis 2.25.0存在部分集群转发相关的已知问题,建议升级至最新稳定版本(如2.30.0及以上),验证问题是否已被修复。
内容的提问来源于stack exchange,提问作者wureka
相关产品推荐
相关产品推荐

