二、RocketMQ架構
圖片來自官網
如上圖所示:Apache RocketMQ是一個分佈式消息和流媒體平臺,具有低延遲、高性能和可靠性、萬億級容量和靈活的可擴展性。它由四個部分組成:NameSever(名稱服務器)、Broker(代理)、Producer(生產者)和Consumer消費者。它們中的每一個都可以水平擴展,以避免單節點部署帶來的單點故障服務不可用問題。這裏還可以看到在Broker集羣採用的是Master/Slave架構,這種架構跟Kafka中Broker Cluster的Leader/Follower架構是有很大不同的,Kafka中的Leader和Follower更像是邏輯概念(每個Broker是消息A的Leader同時又是消息B的Follower),而RocketMQ中的Master和Slave是區分明確的,當一個Master掛了之後,你可以寫到其他Master上,但不會把Slave切換成Master。所以Kakfa裏面Leader掛掉之後有選舉的Leader的過程(依賴Zookeeper實現,把一個Follower升級成Leader),而Rocket MQ是不需要的。
2.1 NameServer Cluster
NameServer Cluster提供輕量級服務發現和路由。每個NameServer記錄完整的路由信息,是一個幾乎無狀態節點,支持快速的存儲擴展,可集羣部署,主要包括兩個功能:
(1)Broker管理:NameSever接受Broker集羣的註冊信息,並提供心跳機制來檢查某個Broker是否仍存活。
(2)路由管理:每個NameServer將保存有關Broker集羣的完整路由信息和用於Client端查詢的Queue信息。
正如我們所知,RocketMQ 客戶端集羣(生產者/消費者)將從NameServer查詢Queue隊列路由信息,但是Client如何找到NameServer的地址呢?
向Client集羣提供名稱服務器地址列表有四種方法:
(1)編程方式,如producer.setnamesrvaddr(“ip:port”)。
(2)Java選項,使用RokMeq.NAMESRV.ADDR。
(3)環境變量,使用名稱srv_addr。
(4)HTTP端點。
以上四種方式具體實現細節:http://rocketmq.apache.org/rocketmq/four-methods-to-feed-name-server-address-list/
2.2 Broker Cluster
Brokers集羣通過提供輕量級的Topic(主題)和Queue(隊列)來處理消息存儲。它們支持Push/Pull模型,包含容錯機制(2個副本或3個副本),並提供按原始時間順序存儲數千億條峯值消息的容量。此外,Broker還提供災備恢復、豐富的統計數據和告警機制等功能,這些都是傳統消息中間件所缺少的。Broker是消息中轉角色,負責存儲消息,轉發消息。分爲 Master Broker 和 Slave Broker,一個 Master Broker 可以對應多個 Slave Broker,但是一個 Slave Broker 只能對應一個 Master Broker。Broker 啓動後需要完成一次將自己註冊至 Name Server 的操作。
Broker負責消息存儲和傳遞、消息查詢、HA保證(HA guarantee)等。
如下圖所示,Broker服務器有幾個重要的子模塊:
(1)遠程處理模塊:是Broker的入口,處理來自Client端的請求。
(2)Client管理模塊,管理Client(生產者/消費者)並維護Comsumer和Topic 的訂閱關係。
(3)存儲服務,提供簡單的API來存儲或查詢物理磁盤中的消息。
(4)HA服務,在Master Broker和Slave Broker之間提供數據同步功能。
(5)索引服務,通過指定的鍵爲消息建立索引,並提供快速消息查詢。
2.3 Producer Cluster
Producer(生產者)支持分佈式部署。生產者集羣通過多種負載平衡模式向Broker 集羣發送消息。發送消息支持快速失敗同時保持低延遲。Producer與 Name Server 集羣中的其中一個節點(隨機)建立長鏈接(Keep-alive),定期從 Name Server 讀取 Topic 路由信息,並向提供 Topic 服務的 Master Broker 建立長鏈接,且定時向 Master Broker 發送心跳。
2.4 Consumer Cluster
Consumer(消費者)也支持分佈式部署,支持Pull/Push兩種消息消費模式。它還支持集羣消費和消息廣播。它提供了實時消息訂閱機制,可以滿足大多數用戶的需求。RocketMQ的網站爲感興趣的用戶提供了一個簡單的快速入門指南。Consumer 與 Name Server 集羣中的其中一個節點(隨機)建立長連接,定期從 Name Server 拉取 Topic 路由信息,並向提供 Topic 服務的 Master Broker、Slave Broker 建立長連接,且定時向 Master Broker、Slave Broker 發送心跳。Consumer 既可以從 Master Broker 訂閱消息,也可以從 Slave Broker 訂閱消息,訂閱規則由 Broker 配置決定。