本文英文原文來自RocketMQ官方核心概念文檔
根據上面的模型,我們能夠深入消息系統設計中的某些主題:
- 並行消費
- 消費熱點問題
- 消費負載均衡
- 消息路由
- 多重連接
- 金絲雀部署(灰度,A/B)
生產者
生產者將業務系統生成的消息發送至代理服務。RocketMQ提供了多種模式來發送:異步(asynchronous),同步(synchronous)和單向(one-way)。
生產者羣組
相同角色的生產者會被分爲一組。同一生產者組的不同生產者實例會被代理服務聯繫起來,用於提交或者回滾事務,防止原始生產者在事務之後崩潰。
警告:考慮到生產者在發送消息時是有十分重要的,每個生產者羣組中只能夠有一個實例啓用,防止沒有必要的生產者實例初始化。
消費者
消費者從代理服務中拉取消息,投遞給應用程序消耗。在用戶應用程序使用中,提供有兩種消費方式:
拉取消費
拉取消費者從代理服務中拉取消息。一旦拉取完批量消息,應用程序就會啓動消費進程。
推送消費
推送消費者,綜合了消息拉取,消費進程,並在其中維護其他工序,對終端用戶開放回調接口,並且在消息到達時被調用。
消費者羣組
類似之前提到的生產者羣組,相同角色的消費者也會被分組起來稱爲消費者羣組。
消費者羣組是一個很好的方式來達到負載均衡,故障恢復,使得我們能夠更簡單的進行消息消費。
警告:消費羣組中的消費實例必須訂閱完全相同的主題。
主題
主題是用於提供生產者投遞消息和消費者拉取消息。主題和生產者消費者之間的關係是非常自由的。一個主題可以有零個,一個或者多個生產者發送消息;反過來,一個生產者也可以給不同的主題發送消息。從消費者的角度,一個主題能夠被零個,一個或者多個消費者羣組訂閱。在一個消費者羣組中,也可以訂閱一個或多個主題,但是要保證羣組內的實例的訂閱是一致的。
消息
消息就是投遞的信息。消息必須對應到主題,可以理解爲當你寫信時的收件人地址。消息也能夠包含一個可選的標籤(tag)或者額外的鍵值對信息。例如,你可以給消息額外設置一個業務主鍵,開發過程中就可以在代理服務去查找消息從而診斷問題。
消息隊列
主題會分段成一個或多個子主題,“消息隊列”。
標籤
標籤也可以稱爲子主題,提供給用戶額外的擴展性。從同一業務模塊發出的不同目的的消息可以使用相同的主題和不同的標籤。標籤能夠使你的代碼保持清晰,還能夠使得RocketMQ提供的查詢系統更加有效。
代理服務
代理服務是RocketMQ的主要組件。它會接收生產者發送的消息,存儲並且處理消費者的拉取請求。它也存儲了消息相關的元數據信息,包括消費者羣組,消費矜持偏移,以及主題/隊列信息。
命名服務
命名服務提供了信息的路由轉發能力。生產者和消費者客戶端可以查找主題,並且找到對應的代理服務列表。
消息模型
- 集羣
- 廣播
消息順序
當你使用 DefaultMQPushConsumer 時,你可以決定使用順序或者並行來消費消息。
- 順序
順序消費意味着消息會以生產者發送到每個消息隊列的順序來進行消費。如果你的場景要求全局順序嚴格控制,那主題中只能只用一個消息隊列。
警告:如果消費順序是特定的,最大的消息消費並行數量就是消費者羣組訂閱的消息隊列的數量。 - 並行
當並行消費消息時,消息消費的並行數量只會受到消費客戶端的線程池的大小限制。
警告:在並行模式中,無法保證消息順序。