ActiveMQ Artemis 双节点集群队列消息无法完全消费问题咨询
异常成因分析
1. 未开启集群队列消息重分发能力
ActiveMQ Artemis 集群默认关闭队列消息的重分发特性:当某节点上的队列不存在本地消费者时,该节点堆积的消息不会自动路由到其他有消费者的集群节点。
你遇到的现象完全匹配该逻辑:消费者仅连接到节点2,节点1无本地消费者,未开启重分发的情况下节点1的消息无法自动路由到节点2消费;手动直连节点1启动消费者后,队列有了本地消费者即可正常消费滞留消息。
2. 消费端连接亲和性导致单节点无消费者
你使用的failover连接协议默认在成功连接任意一个集群节点后,会保持连接亲和性,不会主动建立到其他节点的连接。结合你配置的PooledConnectionFactory连接池,所有消费端会话都会复用首次连接成功的节点(你场景中为节点2),最终导致节点1上的队列没有绑定任何本地消费者。
3. Topic测试正常的原因解释
Topic采用multicast分发模式,集群中所有节点都会将收到的Topic消息同步到所有订阅了该Topic的消费者,不管消费者连接到哪个集群节点,因此不存在队列模式下的本地消费者绑定限制,测试可以正常通过。
修复方案
- 修改Artemis broker配置,在
cluster-connection配置项中添加redistribution-delay="0",开启消息即时重分发能力 - 若要避免连接亲和性问题,可调整连接池配置,或消费端分别建立到两个集群节点的连接,保证每个节点的队列都有本地消费者
- 建议替换为Artemis官方提供的
org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory及对应连接池实现,避免5.x客户端和Artemis服务端的兼容性问题
内容的提问来源于stack exchange,提问作者Nicolas Verducou
相关产品推荐
相关产品推荐

