rocketmq 自動建立topic原始碼分析

2021-10-25 07:12:18 字數 1659 閱讀 4488

預設情況下,topic不用手動建立,當producer進行訊息傳送時,會從nameserver拉取topic的路由資訊,如果topic的路由資訊不存在,那麼會預設拉取broker啟動時預設建立好名為「tbw102」的topic。

topic首次傳送訊息,此時並不能從namserver獲取topic的路由資訊,那麼接下來會進行第二次請求namserver,這時會將isdefault=true,開啟預設「tbw102」從namerserver獲取路由資訊,此時的「tbw102」topic已經被broker預設註冊到nameserver了。

如果isdefault=true並且defaultmqproducer不為空【正常都是不為空】,從nameserver中獲取預設路由資訊,此時會獲取所有已開啟自動建立開關的broker的預設「tbw102」topic路由資訊,並儲存預設的topic訊息佇列數量。

判斷當前topic的資訊是否是有改變,因為未建立過,所以肯定是有改變。

當有改變,則更新本地的topic相關快取資訊。

特別注意:

整個思路實現,就是利用tbw102作為參考,topic不存在,依賴於tbw102的配置資訊,將新topic的新路由更新到本地。這個時候建立topic的請求其實還沒有傳送到我們的broker真正建立,只是快取在我們本地快取。

將「tbw102」topic路由資訊構建topicpublishinfo,並將用topic為key,topicpublishinfo為value更新本地快取,到這裡就明白了,原來broker們千辛萬苦建立「tbw102」topic並將其路由資訊註冊到nameserver,被新來的topic獲取後立即用「tbw102」topic的路由資訊構建出乙個topicpublishinfo並且據為己有,由於topicpublishinfo的路由資訊時預設「tbw102」topic,因此真正要傳送訊息的topic也會被負載傳送到「tbw102」topic所在的broker中,這裡我們可以將其稱之為偷梁換柱的做法。

當broker接收到訊息後,會在msgcheck方法中呼叫createtopicinsendmessagemethod方法,將topic的資訊塞進topicconfigtable快取中,並且broker會定時傳送心跳將topicconfigtable傳送給nameserver進行註冊。

整體的時序圖如下:

1、當topic不存在,且允許自動建立,拿tbw102的topic資訊先快取到本地。

2、在真正傳送資訊給broker時,broker會根據實際傳達到的資訊,建立topic。

RocketMQ通過命令列建立Topic

updatetopic命令很多人都知道,也在部落格上覆制貼上了官網的。但很多人沒有給出具體的簡單例子,對於初學者而言要的就是直觀的例子,可以拷貝下來改個數字直接使用的例子。文件大家都知道看,但很多人看了還是不知道具體怎麼去做。因為官網只是給乙個介紹。具體命令怎麼使用需要靠自己摸索。updatetop...

RocketMQ建立多個消費者問題分析

在乙個程序中同乙個消費組建立多個消費者會出現the consumer group groupname has been created before,specify another name please.defaultmqpushconsumer consumer1 new defaultmqpu...

python自動建立目錄 python自動目錄環境

python自動目錄環境 1 建立工程目錄 2 建立 python 虛擬環境 1 python3.3以上的版本通過venv模組原生支援虛擬環境 apt install python3 venv python3 m venv source bin activate 或者source activate ...