對MQ的理解一直不深,上週看了<Java消息服務>,仍是以爲不夠深刻,找個成熟的產品來學習吧,RabbitMQ是erLang寫的,Kafka是Scala寫的,非Java寫的看起來還須要補充不少知識,ActiveMQ雖然是Java,可是各方面略顯老舊,最終選擇了RocketMQ(4.1.0-incubating release)來學習.服務器
做爲阿里巴巴捐給Apache的項目,官網上有用的資源太少了,處處都只說性能的數據,還有簡單例子,詳細的使用文檔居然沒有了,怪不得沒有kafka流行呢,dubbo的文檔都比這強不少,話說開源產品不是擺來看和吹牛的,讓更多的人方便使用起來纔是開源的核心思想吧,另外源碼中的註釋也實在太少了,還不如我司的項目的註釋齊全呢,跟JDK,Spring比起來差太多了,不過好在名字起的不錯,編碼也規範,看起來還能繼續下去.架構
如圖所示RocketMQ的使用由命名服務,生產者,消費者,中轉服務器組成.性能
Name Server 是一個幾乎無狀態節點,可集羣部署,節點之間無任何信息同步學習
Broker 部署相對複雜,Broker 分爲 Master 與 Slave,一個 Master 能夠對應多個 Slave,可是一個 Slave 只能對應一個 Master,Master 與 Slave 的對應關係經過指定相同的 BrokerName,不一樣的 BrokerId 來定義,BrokerId爲 0 表示 Master,非 0 表示 Slave。Master 也能夠部署多個。每一個 Broker 與 Name Server 集羣中的全部節點創建長鏈接,定時註冊 Topic 信息到全部 Name Server。編碼
Producer 與 Name Server 集羣中的其中一個節點(隨機選擇)創建長鏈接,按期從 Name Server 取 Topic 路由信息,並向提供 Topic 服務的 Master 創建長鏈接,且定時向 Master 發送心跳。Producer 徹底無狀態,可
集羣部署。spa
Consumer 與 Name Server 集羣中的其中一個節點(隨機選擇)創建長鏈接,按期從 Name Server 取 Topic 路
由信息,並向提供 Topic 服務的 Master、Slave 創建長鏈接,且定時向 Master、Slave 發送心跳。Consumer 既能夠從 Master 訂閱消息,也能夠從 Slave 訂閱消息,訂閱規則由 Broker 配置決定。3d
本系列源碼解析主要參照<RocketMQ 原理簡介>來追尋其代碼實現,雖然版本不太一致,但這也是能找到的最詳細的資料了.接下來根據其模塊來源碼閱讀
目錄以下:
1. Name Server
2. Producer
3. Broker
4. Consumerblog