rocketmq问题汇总-一个consumerGroup只对应一个topic

本文深入探讨了RocketMQ中同一订阅组内不同Consumer实例在订阅不同topic时出现的消费混乱问题,详细分析了消费者与broker间的交互过程及异常日志原因,揭示了重平衡流程对消费者订阅状态的影响,并解释了最终导致的警告信息频繁打印的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 同一个订阅组内不同Consumer实例订阅不同topic消费混乱问题调查

图1:


背景说明:

如图1左半部分,假设目前的关系如下:

broker: 两个,broker_a和broker_b

topic:两个,topic1和topic2,每个topic在每个broker上分为4个queue

consumer:两个,consumer1和consumer2,都属于group1,分属于不同的jvm运行。

默认情况下,topic和queue的对应关系是:

topic1 <-> broker_a q0~q3,

topic1 <-> broker_b q0~q3,

topic2 <-> broker_a q0~q3,

topic2 <-> broker_b q0~q3

rebalance流程开始:

假设consumer1先启动,consumer1最终通过rebalance对应关系如下:

topic1 <-> broker_a q0~q3,

topic1 <-> broker_b q0~q3

 

接着consumer2启动,consumer2具体rebalance流程如下:


关键点在5.2,会把consumer1也抓下来,接着根据分配策略会导致consumer2只消费broker_b上topic2对应的q0~q3。

同样,consumer1也会进行rebalance,进而使其只消费broker_a的topic1对应的q0~q3,最终导致其关系变为图1中右图所示。

consumer端警告日志:

rebalance完成之后,consumer端间断打印如下异常:

14:22:04.005 [NettyClientPublicExecutor_3] WARN RocketmqClient - execute the pull request exception
com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 24 DESC: the consumer's subscription not exist
See https://github.com/alibaba/RocketMQ/issues/46 for further details.
at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.processPullResponse(MQClientAPIImpl.java:500) ~[rocketmq-client-3.2.6.jar:na]
at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.access$100(MQClientAPIImpl.java:78) ~[rocketmq-client-3.2.6.jar:na]
at com.alibaba.rocketmq.client.impl.MQClientAPIImpl$2.operationComplete(MQClientAPIImpl.java:455) ~[rocketmq-client-3.2.6.jar:na]
at com.alibaba.rocketmq.remoting.netty.ResponseFuture.executeInvokeCallback(ResponseFuture.java:62) [rocketmq-remoting-3.2.6.jar:na]
at com.alibaba.rocketmq.remoting.netty.NettyRemotingAbstract$2.run(NettyRemotingAbstract.java:262) [rocketmq-remoting-3.2.6.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_51]
at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_51]
at java.lang.Thread.run(Thread.java:744) [na:1.7.0_51]

broker端也发现相应日志:

2015-07-31 16:38:08 WARN ClientManageThread_4 - subscription changed, group: consumerTestGroup remove topic vrs-topic-test SubscriptionData [classFilterMode=false, topic=vrs-topic-test, subString=*, tagsSet=[], codeSet=[], subVersion=1438331853269]

2015-07-31 16:38:22 WARN PullMessageThread_29 - the consumer's subscription not exist, group: consumerTestGroup

consumer&broker异常日志原因:

consumer会定时与所有broker进行心跳通信,代码详见:MQClientInstance.startScheduledTask,默认每30秒心跳一次。

心跳主要作用:

会将HeartbeatData对象发送到broker端,携带consumer group和topic信息

对应到图1中,consumer1会发送类似group1,topic1

consumer2会发送group1,topic2

 

经过走查broker端代码发现如下代码:


重点在步骤4和5.1和5.2,现在只针对一个broker做一下分析:

假设consumer1先启动,对于broker_a一开始关系是group1->topic1

当consumer2启动并rebalance完成后,consumer2发送group1->topic2,

在步骤4,会根据group1将原先的group1->topic1取出。

在步骤5.1,添加topic2

在步骤5.2,移除topic1。

 

而consumer1在rebalance之后同样会进行如上步骤,导致topic1&topic2反复被remove掉,

最终导致了consumer端和broker端的异常日志不停打印。

 

最终结论:是rebalance导致consumer只消费一部分topic,但是显然rocketmq在broker端做了处理,从而不停打印警告信息。

该调查由如何扩容consumer引出

### RocketMQ 控制台功能概述 RocketMQ 提供了一个名为 `rocketmq-console` 的 Web 应用程序,用于管理和监控 RocketMQ 集群。该控制台提供了丰富的功能来帮助管理员和开发者更好地理解和操作消息队列系统。 #### 运维管理 通过 RocketMQ 控制台可以方便地进行日常运维工作,包括但不限于启动、停止服务以及配置修改等功能[^3]。 #### 查询消息 支持按主题名称或其他条件精确查找特定的消息记录,便于排查问题或审计数据流情况。 #### 消息轨迹追踪 能够展示每条消息从生产者发出到被消费者接收整个过程中的流转路径,有助于分析性能瓶颈所在位置并优化架构设计。 #### 查看消费者状态 实时获取各个 Consumer Group 下属实例的工作状况(在线/离线)、拉取进度等重要指标信息,及时发现异常节点以便采取相应措施恢复健康运行状态。 #### 重置消费位点 允许手动调整某个 consumer group 对应 topic 上已读取过的 offset 值,当遇到特殊情况如业务逻辑变更需重新处理历史数据时非常有用处。 #### 死信队列管理 针对未能成功投递给目标消费者的失败消息单独存储起来形成所谓的“死信”,并通过图形化界面对这些特殊对象实施进一步的操作比如清理或者转存他处长期保存待后续处置。 #### 全局消息路由视图 呈现当前环境中所有 broker 及其关联 topics 和 queues 构成的整体网络拓扑结构图表形式展现出来更直观易懂。 #### 订阅关系维护 清晰罗列出每一个 producer 或 consumer 所关心的主题列表及其权限级别设定等内容,在多租户场景下尤为重要以确保不同应用间不会相互干扰影响正常通信秩序。 #### 资源报表统计 定期汇总生成关于磁盘空间占用量、吞吐率峰值等多项关键绩效参数报告文档辅助决策层制定合理的扩容计划或是成本控制策略等方面考量因素。 #### 监控告警机制 内置完善的预警体系一旦检测到预设阈值范围内发生偏离即刻触发通知提醒相关人员尽快介入调查解决问题防止潜在风险扩大造成更大损失。 ### 安装部署指导 对于希望快速上手体验上述特性的用户来说,可以从官方 GitHub 仓库下载最新发布的 WAR 文件直接部署至任意兼容 Servlet 规范的应用服务器之上即可完成初步搭建;而对于追求定制化的高级使用者则建议按照标准 Maven 工程方式克隆源码库之后自行编译打包得到专属版本再行发布上线测试验证效果如何[^5]。 ```bash mvn clean package -Dmaven.test.skip=true ```
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值