RocketMQ Spring Starter消費堆積引發的系統思考和處理

                        小編:管理員 70閱讀 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。

                        邏輯我從下上到上解釋下,主要分為幾步:

                        1. 消費者client啟動時,通過立即發送心跳將自身信息上報給broker。
                        2. broker保存消費者信息。
                        3. 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的消費者實例列表中就看到誰的。

                        至此,大部分問題已經解釋清楚,長文感謝大家閱讀。

                        關聯標簽:
                        少妇各种各样BBBⅩXX