RocketMQ 高階使用場景原理

2021-10-09 22:13:21 字數 2373 閱讀 7413

producer生產訊息的過程

producer投送訊息的過程簡單來說,是首先找到這個topic對應的所有broker的queue,並按照投放策略,

把訊息投放到對應的broker上的queue上。

consumer消費訊息的過程
同乙個消費者組,裡面的消費者,在進行消費的時候,比如消費的topic一共有5個queue,q1,q2,q3,q4,q5

這個消費者組裡面有3個消費者c1,c2,c3,負載均衡下五個消費者會分輪訓分配給這3個消費者,

c1會監聽消費q1,q4;c2監聽消費q2,q5;c3監聽消費q3; 如果此時掛掉乙個消費者,

那麼它監聽消費的queue會重新負載均衡,分配給剩下的兩個消費者。這有乙個什麼問題呢?

也就是說如果乙個消費者組裡面的消費者的個數超過了這個topic的queue的個數,那麼就會有消費者浪費

不能分配到queue進行監聽消費。

而且還有乙個很關鍵的點,就是同乙個消費者組裡面,不同的消費者指定的topic和tag不同的話,

會按照最後乙個消費者組裡面最後乙個連線到mq上的消費者的topic和tag為準,進行消費。

導致部分消費者無法消費到訊息。

commitlog檔案

commitlog格式

除了記錄訊息本身的屬性(訊息長度、訊息體、topic 長度、topic、訊息屬性長度和訊息屬性),

commitlog 同時記錄了訊息所在消費佇列的資訊(消費佇列 id 和偏移量)。由於儲存條目具備不定長的特性,

當 commitlog 剩餘空間無法滿足訊息時,commitlog 在尾部追加乙個 magic code 等於 blank_magic_code

的儲存條目作為結束標記,並將訊息儲存至下乙個 commitlog 檔案

這個檔案就是broker持久化訊息的檔案,為了保證寫入的速度,rocketmq通過順序寫的方式將訊息寫入這個檔案,

即:這個broker會將收到的任何topic的任何queue上的訊息都儲存到這個檔案上面。而不是乙個topic乙個檔案,

因為當topic 的多起來以後,不同的topic來回切換訪問,會導致磁碟讀取不斷的切換位置,去載入對應topic的檔案。

所以這裡rocketmq避免了來回切換,就用乙個檔案儲存所有的訊息,這樣寫入的時候就可以一直寫下去。避免了

磁碟讀取不斷切換。但是這樣就導致乙個問題,原本寫入不同topic 不同queue的訊息怎麼查詢呢?

這就用到了consumequeue檔案了。

consumequeue檔案

consumequeue格式

consumequeue 的儲存條目採用定長儲存結構,如下圖所示。為了實現定長儲存,consumequeue 

儲存了訊息 tag 的 hash code,在進行 broker 端訊息過濾時,通過比較 consumer 訂閱 tag 的 hashcode

和儲存條目中的 tag hash code 是否一致來決定是否消費訊息

rocketmq 引入 index 的目的是為訊息建立索引方便問題排查:在給定訊息 topic 和 key 的前提下,

快速定位訊息。index 的檔案儲存結構如下圖所示。index 的整體設計思想類似持久化在磁碟的 hashmap,

多個 message index 通過 preindexoffset 連線

了解到這裡,我們繼續說上面說到的同乙個消費者組不同消費者的topic和tag不同的時候,

會導致什麼?下面說一下消費者消費的過程:

首先consumer從自己監聽的對應的broker的queue上拉取對應的topic的tag的訊息,

但是messagequeue下面的consumequeue檔案只有索引沒有具體的檔案,就需要根據索引從commitlog檔案裡面找到訊息,載入到broker中

從commitlog找到對應偏移量位置的訊息後,會先進行tag的hashcode校驗,發現一直就會直接返回給消費者。

消費者收到訊息後,本地還會在根據tag的字面值進行訊息的過濾匹配。

所以上面說的同乙個消費者組consumer裡面的c1監聽q1,q2; c2監聽q3,q4;但是c1消費 topic1 tag1,c2消費topic2 tag2,且c2最後註冊到mq,那麼此時消費者組consumer的消費監聽的就是topic2 tag2.上面的三個步驟就是按照topic2 tag2去操作的,這個時候就會導致儘管q1.q2上面有對應的topic1 tag1,和topic2 tag2的訊息,仍然無法消費。

Git使用場景 命令使用場景

通過個人使用git時候的遇到的使用場景,熟悉了解相關命令,也記錄一下場景的使用方法。所有場景均在ubuntu16.04 linux 作業系統下,其他作業系統有差異的地方自行查閱相關資料。安裝git sudo apt get install git設定及檢視git配置 user.name和user.e...

mongodb 使用場景和不使用場景

1.mongodb介紹 mongodb 名稱來自 humongous 是乙個可擴充套件的高效能,開源,模式自由,面向文件的資料庫。它使用c 編寫。mongodb特點 a.面向集合的儲存 適合儲存物件及json形式的資料。b.動態查詢 mongo支援豐富的查詢表達方式,查詢指令使用json形式的標記,...

mongodb 使用場景和不使用場景

mongodb 使用場景和不使用場景 2012 09 26 10 30 18 分類 linux 1.mongodb介紹 mongodb 名稱來自 humongous 是乙個可擴充套件的高效能,開源,模式自由,面向文件的資料庫。它使用c 編寫。mongodb特點 a.面向集合的儲存 適合儲存物件及js...