RocketMQ探祕——客戶端消費
阿新 • • 發佈:2018-12-15
一、客戶端元件總覽
每個客戶端有一個管理者(MQClientManager),是單例,負責生產MQInstance物件,MQClientManager通過id將多個MQInstance物件放在一個列表中。MQClientManager的id命名規範是[email protected]@unitName。一般情況下是一個客戶端只有一個MQInstance物件。MQInstance通過組名來管理多個生產者與消費者,即一個分組只能又一個生產者與消費者。MQInstance通過pullmessage服務完成訊息的拉取,通過rebalanceservice實現訊息負載均衡,由此也可以看出RocketMQ是做服務端做了負載均衡策略。MQClientAPIImpl是與遠端互動的rpc介面。關係圖如下所示。
二、訊息拉取
拉取訊息就要知道到哪裡拉取,什麼時候拉取。這兩個功能分別由rebalanceService和pullMessageService完成。rebalanceService會20秒執行一次負載均衡。負載均衡主要的幹了以下幾個事:
1、獲取topic在broker中得分佇列地址messageQueue,一個topic可以對多個broker,所以messagequeue也有多個
2、從nameserver上獲取所有的客戶端資訊
3、根據負載均衡策略找出某個客戶端可消費的messagequeue
4、根據messagequeue生成pullRequest物件,放到pullMessageService的佇列中
到此rebalance已經完成拉取請求的生產,pullMessageService通過消費pullrequest來拉取訊息