- Producer
- Customer
- NameServer: Broker的注冊服務發現中心
- BrokerServer:主要負責消息的存儲、投遞和查詢以及服務高可用保證
RocketMQ的集群部署:
- 單個master的分支
- 多個Master 模式:集群中有多個 Master 節點,彼此之間相互獨立。生產者可以將消息發送到任意一個 Master 節點,消費者也可以從任意一個 Master 節點消費消息
- 多個Master 和 多個Slave 模式 :
-
- 同步雙寫:每個 Master 節點都有一個或多個 Slave 節點與之對應。在消息寫入時,生產者發送的消息不僅要寫入 Master 節點,還要同步寫入對應的 Slave 節點,只有當 Master 和 Slave 都寫入成功,才會向生產者返回成功響應。
- 異步復制:同樣是每個 Master 節點配備一個或多個 Slave 節點,但消息寫入時,生產者發送的消息只需要寫入 Master 節點成功,就會向生產者返回成功響應,而 Master 節點會異步地將消息復制到 Slave 節點
為什么RocketMQ不使用Zookeeper,反而自己寫NameServer>
在第三種模式中,Master只需要做好自己的事情就行了,不需要需要知道彼此的存在。
ZooKeeper可以提供Master選舉功能。比如Kafka用來給每個分區選一個broker作為leader。
對于RocketMQ來說,topic的數據在每個Master上是對等的,沒有哪個Master上有topic上的全部數據。不用處理維護之間的關系。
RocketMQ的高可用:
- NameServer的高可用:NameServer存放的數據相同
- BrokerServer: 主從模式,從可以被消費,并且從節點可以轉成主
- consumer 的高可用:當master不可以用的話,可以從slave讀取
- produce : 多個master讀取
raft的模式可以自動選擇主節點
- 每個 Broker 與 NameServer 集群中的所有節點建立長連接,定時注冊 Topic 信息到所有 NameServer。
- Producer 與 NameServer 集群中的其中一個節點建立長連接,定期從 NameServer 獲取 Topic 路由信息,并向提供 Topic 服務的 Master 建立長連接,且定時向 Master 發送心跳。Producer 完全無狀態。
- Consumer 與 NameServer 集群中的其中一個節點建立長連接,定期從 NameServer 獲取 Topic 路由信息,并向提供 Topic 服務的 Master、Slave 建立長連接,且定時向 Master、Slave 發送心跳。Consumer 既可以從 Master 訂閱消息,也可以從 Slave 訂閱消息。