rocketmq单一队列不消费问题

(一)问题现象

同事反馈,产线有一个topic,总共4个消息队列,其他3个都正常,但是有一个队列只进不出,消息一直挤压,挤压的量越来越大,感觉完全不消费了。

(二)问题排查

按照经验,初步怀疑是应用侧消费进程堵死了导致的

通过jstack取了不同时间段,该应用的线程dump信息

发现"ConsumeMessageThread_13" #274这个线程一直处于RUNNABLE,堵死了

然后进一步分析该线程是具体是在干啥的

 线程堵住的地方在发送邮件的部分,估计是处理超时且没加超时时间导致,查看代码确认

 果然,没加超时时间

那有一个问题,为啥单个线程堵死会造成整个队列都完全不消费了?

这是因为rocketmq是最小位点提交机制,虽然是并发消费消息,但是上报的是最小位点,一条消息没消费成功,后续位点就没法推动,就会触发消费端限流,进而出现这种一个队列不消费了的情况。

总结

消费端发送邮件部分没加超时时间,异常情况导致线程一直堵死,又因为rocketmq是最小位点提交机制,导致该消息后续位点的消息都没法消费,进而就产生了这种就一个队列只进不出的现象。

### RocketMQ队列模式下消费者组对同一 Topic 的消息消费逻辑 在 RocketMQ 中,当多个消费者组订阅同一个 Topic 时,它们之间的消息消费行为是相互独立的。具体来说: - **消费者组的概念** 每个消费者组(Consumer Group)代表一组具有相同消费逻辑的消费者实例集合。同的消费者组可以订阅相同的 Topic[^4]。 - **消息分发机制** 对于同一个 Topic 下的消息,如果存在多个消费者组,则每个消费者组都会独立接收到该 Topic 的全部消息副本。这意味着即使某个消费者组已经消费了一条消息,其他消费者组仍然会接收到这条消息并执行自己的消费逻辑[^1]。 - **队列分配策略** 在 RocketMQ 中,Topic 被划分为多个队列(Queue)。对于每一个消费者组而言,其内部的消费者实例会通过某种负载均衡算法来分配这些队列。常见的分配方式有广播模式(Broadcasting)和集群模式(Clustering)。其中,在集群模式下,每条消息只会被一个消费者实例消费;而在广播模式下,所有消费者实例都会接收并处理同一条消息[^2]。 - **顺序消费保障** 如果启用了顺序消费模式(consumeMessageOrderly),那么在一个特定队列上的消息将严格遵循 FIFO(先进先出)原则进行处理,并且此队列仅能由当前消费者组内的单一线程负责消费操作。 #### 示例代码展示 以下是实现两个消费者组分别订阅同一 Topic 并采用消费模式的例子: ```java // 消费者组A配置 - 使用集群模式 DefaultMQPushConsumer consumerGroupA = new DefaultMQPushConsumer("consumer_group_a"); consumerGroupA.subscribe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白衣神棍

大爷,看的满意就赏个子呗!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值