You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActiveMQ Artemis多播地址消息投递不一致问题排查求助

Artemis 2.19.0 双XPATH过滤多播队列消息丢失问题分析

问题回顾

执行以下操作后出现消息丢失:

  • 创建多播地址IN.ADDRESS.FOO
  • 绑定两个持久队列IN.QUEUE1.FOO、IN.QUEUE2.FOO到该地址
  • 两个队列均配置XPATH过滤器:XPATH '/XML/DATA/Direction[text()="Right"]'
  • 10个并发任务共发送1000条匹配规则的20kb XML消息到该地址

异常表现:其中一个或两个队列无法接收全部1000条消息;移除任一队列的过滤器,或移除publish-subscribe-channel的task-executor属性后,消息可正常全量接收。

已排除的可能性:主备HA架构下死信队列(DLQ)无内容,排除重发次数超限问题;无消费者连接时问题仍存在,排除消费端因素。


疑问解答

1. 是否因XML过滤器比普通过滤器慢很多导致消息丢失?

XPATH过滤确实比简单属性过滤开销高——XML解析、节点遍历会占用更多CPU和内存资源,但单纯性能慢不会直接引发消息丢失,而是当性能瓶颈遇到并发发送+多过滤队列的场景时,触发了Artemis内部的处理缺陷。

2. 可能的核心原因

结合环境信息和验证结果,主要指向两个方向:

  • Artemis 2.19.0多播过滤并发处理缺陷:同一地址下存在多个XPATH过滤队列时,并发发送消息可能导致过滤器的消息路由逻辑出现竞态条件,部分消息未被正确路由到所有匹配队列。该版本在多过滤队列的并发路由处理上存在不完善,后续版本(如2.20+)有相关修复记录。
  • Spring Integration异步发送的协同问题:publish-subscribe-channel的task-executor会异步发送消息,当Artemis服务器因XPATH过滤负载较高时,异步发送的消息可能因服务器端路由线程阻塞或队列满溢,导致消息未被正确持久化或路由。移除task-executor改为同步发送后,消息发送节奏与服务器处理能力匹配,避免了路由丢失。

临时解决方案与建议

  • 临时移除任一队列的XPATH过滤器,或关闭publish-subscribe-channel的异步执行器,改为同步发送。
  • 升级Artemis到2.20.0及以上版本,修复多过滤队列的并发路由问题。
  • 若无法升级,可将XPATH过滤逻辑前置到发送端,只发送符合条件的消息到目标地址,减轻服务器端过滤压力。

内容的提问来源于stack exchange,提问作者LiamFu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 11:47:03