RocketMQ Spring Starter消费堆积引发的系统思考和处理
小编:管理员 229阅读 2022.08.01
6. 周边问题解决
第二个问题:在消费详情中,为什么Pull消费者在Dashboard中不显示消费者client和queue的关系信息呢?
实际下图的空白中,是Pull消费者消费的,却没有consumerClient。
第三个问题:在消费者实例列表中,明明Pull和Push消费者的ConsumerType不一样,为什么这里只显示了CONSUME_ACTIVELY(Pull)
下面先解释第二个问题。
用户看到的消费详情是怎么来的呢?调用代码逻辑是由上至下查看的,依次是
rocketmq-dashboard --->
rocketmq admin tool --->
rocketmq broker --->
rocketmq client。
逻辑我从下上到上解释下,主要分为几步:
- 消费者client启动时,通过立即发送心跳将自身信息上报给broker。
- broker保存消费者信息。
- dashboard通过admin tool的接口获取消费者信息展示。
通过以上简单描述后我们知道:我们看到的信息都是消费者自己上报的结果,哪些信息有,哪些信息没有,就只需要看哪些信息消费者是否有上报逻辑即可。
这里贴下主要代码截图:
dashboard代码
实际在调试中发现,
1. Pull消费者连接信息在Broker中正常上报保存。也即是
ConsumerConnection对象正常返回。
2. Pull消费者在根据client id获取ConsumerRunningInfo信息时,返回空。
通过getConsumerRunningInfo()方法,我们顺藤摸瓜,发现是broker在接到getConsumerRunningInfo()调用时,它调用了client的接口获取当前运行时信息。
Broker代码
这里broker调用了client的接口,实时获取了ConsumerRunningInfo信息。
Client上报消费者代码
消费者客户端在收到broker的请求后,客户端通过
最终调用到了consumerRunningInfo()方法。
这个方法在DefaultLitePullConsumer、DefaultMQPullConsumer、DefaultMQPushConsumer的一些响应实现有不一样。
当前问题RocketMQ Spring Starter使用的是DefaultLitePullConsumer,以下我截图了关键不同代码:左边是DefaultLitePullConsumer,右边是DefaultMQPushConsumer的实现逻辑:
可以看出DefaultLitePullConsumer没有上报自己消费了哪些queue,所以在dashboard中看不到。
现在我们解释下第三个问题。
其实是Broker存储消费的问题,消费者信息是如何到broker中的,代码调用次序如:
rocketmq client 消费者 --->
心跳 ---->
broker --->
ConsumerManager#registerConsumer()--->
ConsumerManager. consumerTable.
通过以上代码,我们可以知道:相同消费者组名的ConsumeType,MessageModel,ConsumeFromWhere都只有一个值,谁先上报在dashboard的消费者实例列表中就看到谁的。
至此,大部分问题已经解释清楚,长文感谢大家阅读。
相关推荐
- 【RocketMQ系列】RocketMQ集群,RocketMQ-on-DLedger集群 本文RocketMQ系列第四篇,主要介绍RocketMQ集群及如何部署自动容灾切换的 RocketMQ-on-DLedger Group。RocketMQ集群搭建ROcketMQ集群搭建有以下几种方案:「单Master模式」「多Master模式」「多Master多Slave模式-异步复制」「多Master多Slave模式-同步双写」其…
- 3DMAX提示和技巧 本主题标识使用 Civil View 的一些重要提示和技巧。常规使用屏幕分辨率至少为 1280x1024 的 Civil View。低于此分辨率时,一些面板将占用过多屏幕空间。 将视口设置为线框显示以达到最佳性能。 要尽可能简化用户界面,请在单个视口中工作并关闭 3ds Max 命令面…