系列
說到rocketMq的consumer,該篇文章特指pushConsumer,pullConsumer在后續文章中在分享。
提到consumer,需要搞清楚幾個核心問題,分別是consumer的初始化過程做了哪些事情,消息是如何消費,consumer如何動態平衡的,整個邏輯還是比較繞的,其中這章節主要會講清楚兩個事情,1、初始化過程中client做了哪些事情;2、consumer如何動態平衡拉取任務,具體的任務消費會由額外的一章進行講解。
consumer的初始化過程
說明:整體執行過程如下,著重介紹subscribe和start兩個過程
? ? 1、創建consumer并設置消費分組
? ? 2、設置消費位移
? ? 3、設置訂閱topic
? ? 4、設置消費執行的回調函數
? ? 5、啟動consumer
consumer的初始化流程圖
consumer內部初始化過程
說明:整個初始化比較復雜,為了大家能夠理解,先用簡單的語句概述一遍
? ? 1、構建consumer的訂閱信息,包括consumer本身的訂閱和消費分組的重試隊列。
? ? 2、創建Rebalance服務,該服務每隔20s進行消費端負責的messageQueue的消費。
? ? 3、啟動消費偏移量獲取服務,獲取上一次消費位移。
? ? 4、啟動定時任務,其中核心任務之一是定時去namesrv拉取broker信息。
? ? 5、啟動pullMessageService,負責從broker拉取待消費消息
? ? 6、啟動rebalanceService,負責定期調整consumer端負載均衡包括第一次觸發拉取任務
? ? 7、其中rebalanceService和pullMessageService相互配合使用,前者負責將新加入messageQueue拉取任務加入到pullMessageservice當中,將舊的messageQueue的拉取任務從pullMessageService中停止,兩者之間通過消息隊列的形式進行通信。
構建subscription過程
說明:參見DefaultMQPushConsumerImpl類
? ? 1、訂閱消息最后保存至RebalanceImpl當中,因為這個是后面動態負載均衡的核心。
client端啟動過程
說明:參見DefaultMQPushConsumerImpl類
說明:參見DefaultMQPushConsumerImpl類
? ? 1、啟動了獲取消費進度的服務
說明:參見MQClientInstance類
? ? 1、啟動定時任務,主要是從namsrv中拉取broker的信息
? ? 2、啟動client從broker拉取消息的服務
? ? 3、啟動Rebalance服務,負責觸發消息拉取的任務
? ? 4、步驟3和步驟4之間的兩個服務通過消息隊列通信
說明:參見MQClientInstance類
? ? 1、負責從namesrv拉取broker的信息
拉取任務的執行過程
說明:參見PullMessageService類
? ? 1、負責從pullRequestQueue中獲取拉取任務并執行,該任務由Rebalance服務投遞
拉取任務的生成過程
說明:參見RebalanceService類
? ? 1、consumer端負載均衡的入口
說明:參見MQClientInstance類
? ? 1、每個consumer客戶端只會有一個對象,所以這里for循環只有一次。
說明:參見MQClientInstance類
1、針對每個訂閱信息都進行動態負責均衡,包括consumer本身的訂閱分組和consumerGroup的重試分組。
說明:參見RebalanceImpl類
? ? 1、動態負載均衡就是一個topic下所有的messageQueue和消費分組里面的消費者按照一定的動態調整策略進行分配,同一個消費分組里面的消費者每人負責一部分的messageQueue。
說明:參見RebalanceImpl類
? ? 1、consumer新負責的messageQueue加入到拉取任務當中來
? ? ? ? 2、consumer不負責的messageQueue從拉取任務中剔除。
說明:參見PullMessageService類
說明:參見PullMessageService類
訂閱重試隊列邏輯
說明:
? ? 核心代碼邏輯,這個表明了consumer訂閱了重試隊列并對重試隊列進行消費。