已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】
RocketMQ 4.9.7(3 broker 集群),topic order-event 共 256 个 queue,消费组 8 实例、consumeThreadMin=20 / Max=64,日均 6000 万条,走 at-least-once + 业务幂等表(MySQL 8.0,分库分表)。消息体里带一个 channelId,其中 channelId=CH-042(某支付渠道)的下游依赖是第三方网关,正常 RT 80ms。
【现象】
近两天 CH-042 的第三方网关劣化到 800–1500ms/次,占整 topic 大约 6% 的流量(≈15 个 queue 受影响)。结果是整个消费组 lag 从常态 3k 涨到 120 万,且 consumerProgress 里能看到:慢的那 15 个 queue 落后 8 万+,其余 241 个 queue 只是被线程池"挤占"后被动落后 2000–5000。也就是说不是整体产能不够,是慢队列把线程池资源吃光,快队列被连带拖慢。
【已尝试的排查与结果】
MessageQueueSelector 改投到一个新 topic order-event-slow,另起一个 2 实例的消费组:可行,但改 selector 需要发布、且发布窗口内老消息仍走原 topic,做不到不停服;【期望得到的答案形态】 希望社区给一个不重新发布业务代码、不停服、可回滚的隔离方案,最好包含:
MessageListener 拆分?独立 consumer group + 过滤表达式 SQL92?还是 broker 侧 topic 拆分?),给出配置或代码片段;