1、观察consumer线程
使用arthas分析
-
MQClientFactoryScheduledThread 定时任务线程
定时任务线程,包含如下任务:
每2分钟更新nameServer列表
每30秒更新topic的路由信息
每30秒检查broker的存活,发送心跳请求
每5秒持久化消费队列的offset。如果是广播模式,持久化在本地;如果是集群模式,反馈给broker
每分钟调整线程池大小(实际上并没有作用。因为最终执行是空方法) -
PullMessageService 从broker拉取msg的线程。
-
RebalanceService 重平衡线程。每20秒执行一次
具体可查看org.apache.rocketmq.client.impl.factory.MQClientInstance#start()
2、重平衡,任务是如何创建的
重平衡,就是在消费者组动态伸缩的时候,自动把队列重新分配。具体工作的线程,就是RebalanceService。如下是整个重平衡的类图流程
如图,启动时,会触发重平衡任务org.apache.rocketmq.client.impl.consumer.RebalanceService#run()
重平衡的关键点在于如何动态伸缩,重点内容在org.apache.rocketmq.client.impl.consumer.RebalanceImpl#doRebalance
- 第一步,获取topic对应的队列集合Set<> mqSet
- 第二步,随机从一个可选broker上,获取所有消费者的集合List cidAll。cid就是消费端的唯一标识。格式如下:“ip@pid#时间戳”,比如127.01.01.01@1723#2926328724786400
- 第三步,按字段排序mqSet和cidAll。Collections.sort()
if (mqSet != null && cidAll != null) {
List<MessageQueue> mqAll = new ArrayList