Topic
一類消息的集合,RocketMQ的基本訂閱單位
部署結構
Name Server
Name Server 為 producer 和 consumer 提供路由信息。
相對來說,nameserver的穩定性非常高。原因有二:
- nameserver互相獨立,彼此沒有通信關系,單台nameserver掛掉,不影響其他nameserver,即使全部掛掉,也不影響業務系統使用。無狀態
- nameserver不會有頻繁的讀寫,所以性能開銷非常小,穩定性很高。
Broker Server
代理服務器,消息中轉角色,負責存儲消息、轉發消息
消息模型
Producer
消息生產者,生產者的作用就是將消息發送到 MQ,生產者本身既可以產生消息,如讀取文本信息等。
也可以對外提供接口,由外部應用來調用接口,再由生產者將收到的消息發送到 MQ。
與NameServer關系
- 連接
- 單個生產者者和一台NameServer保持長連接,定時查詢topic配置信息,如果該NameServer掛掉,生產者會自動連接下一個NameServer,直到有可用連接為止,並能自動重連。
- 心跳
- 無心跳連接
- 輪詢時間
- 默認情況下,生產者每隔30秒從NameServer獲取所有topic的最新隊列情況,這意味着某個broker如果宕機,生產者最多要30秒才能感知,在此期間,發往該broker的消息發送失敗。該時間由DefaultMQProducer的pollNameServerInteval參數決定,可手動配置。
與Borker關系
- 連接
- 單個生產者和該生產者關聯的所有broker保持長連接。
- 心跳
- 默認情況下,生產者每隔30秒向所有broker發送心跳,該時間由DefaultMQProducer的heartbeatBrokerInterval參數決定,可手動配置。broker每隔10秒鍾(此時間無法更改),掃描所有還存活的連接,若某個連接2分鍾內(當前時間與最后更新時間差值超過2分鍾,此時間無法更改)沒有發送心跳數據,則關閉連接。
- 斷開
- 移除broker上的生產者信息
Broker
Broker 接收來自生產者的消息,儲存以及為消費者拉取消息的請求做好准備。
與NameServer關系
- 連接
- 單個broker和所有nameserver保持長連接
- 心跳
- 心跳間隔:每隔30秒(此時間無法更改)向所有nameserver發送心跳,心跳包含了自身的topic配置信息。
- 心跳超時:nameserver每隔10秒鍾(此時間無法更改),掃描所有還存活的broker連接,若某個連接2分鍾內(當前時間與最后更新時間差值超過2分鍾,此時間無法更改)沒有發送心跳數據,則斷開連接。
- 斷開
- 時機:broker掛掉;心跳超時導致nameserver主動關閉連接
- 動作:一旦連接斷開,nameserver會立即感知,更新topic與隊列的對應關系,但不會通知生產者和消費者
負載均衡
- 一個topic分布在多個broker上,一個broker可以配置多個topic,它們是多對多的關系。
- 如果某個topic消息量很大,應該給它多配置幾個隊列?這什么意思,並且盡量多分布在不同broker上,減輕某個broker的壓力。
- topic消息量都比較均勻的情況下,如果某個broker上的隊列越多,則該broker壓力越大。
Consumer
消息消費者,簡單來說,消費 MQ 上的消息的應用程序就是消費者,至於消息是否進行邏輯處理,還是直接存儲到數據庫等取決於業務需要。
與NameServer關系
- 連接
- 單個消費者和一台nameserver保持長連接,定時查詢topic配置信息,如果該nameserver掛掉,消費者會自動連接下一個nameserver,直到有可用連接為止,並能自動重連。
- 心跳
- 不心跳關聯
- 輪詢時間
- 默認情況下,消費者每隔30秒從nameserver獲取所有topic的最新隊列情況,這意味着某個broker如果宕機,客戶端最多要30秒才能感知。該時間由DefaultMQPushConsumer的pollNameServerInteval參數決定,可手動配置。
與Borker關系
- 連接
- 單個消費者和該消費者關聯的所有broker保持長連接。
- 心跳
- 默認情況下,消費者每隔30秒向所有broker發送心跳,該時間由DefaultMQPushConsumer的heartbeatBrokerInterval參數決定,可手動配置。broker每隔10秒鍾(此時間無法更改),掃描所有還存活的連接,若某個連接2分鍾內(當前時間與最后更新時間差值超過2分鍾,此時間無法更改)沒有發送心跳數據,則關閉連接,並向該消費者分組的所有消費者發出通知,分組內消費者重新分配隊列繼續消費。
- 斷開
- 時機:消費者掛掉;心跳超時導致broker主動關閉連接
- 動作:一旦連接斷開,broker會立即感知到,並向該消費者分組的所有消費者發出通知,分組內消費者重新分配隊列繼續消費
負載均衡
- 集群消費模式下,一個消費者集群多台機器共同消費一個topic的多個隊列,一個隊列只會被一個消費者消費。
- 如果某個消費者掛掉,分組內其它消費者會接替掛掉的消費者繼續消費。
消費機制
- 本地隊列
- 消費者不間斷的從broker拉取消息,消息拉取到本地隊列,然后本地消費線程消費本地消息隊列,只是一個異步過程,拉取線程不會等待本地消費線程,這種模式實時性非常高。對消費者對本地隊列有一個保護,因此本地消息隊列不能無限大,否則可能會占用大量內存,本地隊列大小由DefaultMQPushConsumer的pullThresholdForQueue屬性控制,默認1000,可手動設置。
- 輪詢間隔
- 消息拉取線程每隔多久拉取一次?間隔時間由DefaultMQPushConsumer的pullInterval屬性控制,默認為0,可手動設置。
- 消息消費數量
- 監聽器每次接受本地隊列的消息是多少條?這個參數由DefaultMQPushConsumer的consumeMessageBatchMaxSize屬性控制,默認為1,可手動設置。
消費進度存儲
- 每隔一段時間將各個隊列的消費進度存儲到對應的broker上,該時間由DefaultMQPushConsumer的persistConsumerOffsetInterval屬性控制,默認為5秒,可手動設置。
連接數
- 如果一個topic在某broker上有3個隊列,一個消費者消費這3個隊列,那么該消費者和這個broker有幾個連接?
- 一個連接,消費單位與隊列相關,消費連接只跟broker相關,事實上,消費者將所有隊列的消息拉取任務放到本地的隊列,挨個拉取,拉取完畢后,又將拉取任務放到隊尾,然后執行下一個拉取任務
Group
Producer Group
生產者組,簡單來說就是多個發送同一類消息的生產者稱之為一個生產者組。
Consumer Group
消費者組,和生產者類似,消費同一類消息的多個 consumer 實例組成一個消費者組(集群)。
Tag
標簽可以被認為是對Topic進一步細化。一般在相同業務模塊中通過引入標簽來標記不同用途的消息。
RocketMQ支持給在發送的時候給topic打tag,同一個topic的消息雖然邏輯管理是一樣的。但是消費topic1的時候,如果你訂閱的時候指定的是tagA,那么tagB的消息將不會投遞。
Message
Message 是消息的載體。一個 Message 必須指定 topic,相當於寄信的地址。
Message 還有一個可選的 tag 設置,以便消費端可以基於 tag 進行過濾消息。
也可以添加額外的鍵值對,例如你需要一個業務 key 來查找 broker 上的消息,方便在開發過程中診斷問題。
Message Queue
簡稱queue或Q,消息物理管理單位。一個Topic將有若干個Q。若Topic同時創建在不同的Broker,則不同的broker上都有若干Q,消息將物理地存儲落在不同Broker結點上,具有水平擴展的能力。
Offset
RocketMQ中,有很多offset的概念。但通常我們只關心暴露到客戶端的offset。一般我們不特指的話,就是指邏輯Message Queue下面的offset。
Consumer Offset
用於標記Consumer Group在一條邏輯Message Queue上,消息消費到哪里了。注:從源碼上看,這個數值是最新消費的那條消息的offset+1,所以實際上這個值存儲的是【下次拉取的話,從哪里開始拉取的offset】。
參考
https://www.jianshu.com/p/3938d990a8de
https://www.cnblogs.com/qdhxhz/p/11094624.html