消息隊列
參考官方文檔:https://rocketmq.apache.org/zh/docs/
基本概念
- 主題(Topic):是消息傳輸和消息存儲的頂級容器,不是實際的消息容器,而是一個邏輯上的概念,用于區分不同業務消息的標識,內部包含:消息隊列(MessageQueue)、消息(Message)。
- 消息類型(MessageType):按照消息的傳輸特性的不同而定義的不同類型,用于類型管理和權限校驗,包含了:普通消息(Normal)、順序消息(FIFO)、事務消息(Transaction)和定時/延時消息(Delay)。
- 消息隊列(MessageQueue):是消息傳輸和消息存儲的實際容器,是消息存儲的最小存儲單元;一個主題由多個隊列組成;由于隊列的先進先出特性,可以通過Offset來標記消息在隊列中的位置以及確定消息之間的順序;還可通過Offset去讀取任意數量的消息,以實現聚合讀取、回溯讀取的特性。
- 消息(Message):最小的數據傳輸單元,生產者將業務數據的負載和擴展屬性包裝到消息中發送到服務端進行存儲,然后按照相關語義和訂閱關系投遞到消費者進行消費;特性:不可變性,持久性。
- 消息視圖(MessageView):就是面向開發的一個消息只讀接口,可以查看不能修改。
- 消息標簽(MessageTag):是基于主題在進行細分的一個標簽,就是給同一主題的消息打上不同的標簽,然后消費者如果訂閱了一個主題,然后它會根據它想要的標簽進行篩選,以此來實現細粒度過濾。
- 消息位點(MessageQueueOffset):可以理解為每一個消息對于隊頭位置的偏移量,那么每一個消息都可以確定一個Offset,作用:可以通過記錄消費的Offset來確保不會重復消費消息,而且可以通過改變消費Offset的來重新消費某個消息。
- 消費位點(ConsumerOffset):即消費者消費的位置,一定是滿足 MinOffset <= ConsumerOffset <= MaxOffset,如果超出這個范圍,則服務端會強制將 ConsumerOffset 定位到合法的 Offset。
- 消息索引(MessageKey):相當于數組下標的索引,可以通過O(1)的時間訪問到索引對應的消息。
- 生產者(Producer):即消息的生產者,作用是構建并傳輸消息到服務器的實體,按照要求將業務消息數據封裝并發送給服務器,就是純純給服務器干活的;那干活也有自己的方式:通過API接口去傳遞信息,同樣可以進行批量傳輸的設置,還有就是發送事務消息,這時候生產者就不能夠發完之后撒手不管了,這之間有一個半事務消息的概念,此時不算發送完成,生產者要去執行本地事務消息,再向服務器進行二次事務確認,這時候生產者心想:發送個消息這么麻煩,但是看到自己生產的消息能夠到達相應的位置不至于仍在半路沒人處理強啊,還是會很欣慰的!
- 事務檢查器(TransactionChecker):生產者用于執行本地事務檢查和異常事務恢復的監聽器;就是剛才說的生產者發送消息后不能不管不問,需要通過事務檢查器來監聽自己生產的消息是否被正確應用了;流程:生成一條半事務消息 ==> 執行本地事務 ==> 提交事務狀態 ==> if(Broker未收到事務狀態) ==> 生產者進行回查 ==> 回查相應 ==> Broker 根據返回狀態處理消息。
- 事務狀態(TransactionResolution):包含事務提交、事務回滾、事務未決,服務端通過判斷事務狀態來控制事務消息是否應該提交。
- 消費者分組(ConsumerGroup):類似于主題(Topic),是一個邏輯概念,每一個分組通過在服務端注冊的訂閱關系規則獲得Topic,Topic 與 消費者分組 是多對多關系;同時能夠設置投遞消息的順序;能夠設置消息重試策略。
- 消費者(Consumer):類似于隊列(MessageQueue),是接受并消費信息的實體,必須關聯到一個消費者組,同一個分組的消費者的行為約束要相同。
- 訂閱關系(Subscription):就是針對接受到的消息消費者該怎么處理,取舍哪些的一個規則,同時也利用了消息過濾,并維護了消費狀態。
- 消息過濾:就是根據訂閱上面介紹的消息標簽來進行過濾篩選,這個工作由服務端來完成。
- 重置消費位點:就是重新設置消費者要從哪里開始進行信息的消費。
- 消息軌跡:一條消息從生產者到消費者走過的路記錄下來,方便排查錯誤信息。
- 消息堆積:供多需少,生產的速度大于消費的速度,那些沒有來得及消費的信息便堆積在了一起。
- 事務消息:高級消息類型,保證消息生產和本地事務保持一致性。
- 定時/延時消息:高級消息類型,相當于設置定時任務,到達指定時間之后才能夠被消費者消費。
- 順序消息:按照業務中發送消息的順序去消費,實現業務中的順序處理;就比如搶票,前面提交消息的人一定比后面提供消息的人先得到票。
以上是對RocketMQ中的基本概念的理解,相信了解了這些之后,再去理解其中的業務邏輯會更加得心應手,以上這些概念就類似于零部件,然后記下來就是如何將零件組裝起來造出來一個產品,會持續更新~