深入研究RocketMQ生產者發送消息的底層原理

 

前言

hello,小夥伴們,王子又來和大家研究RocketMQ的原理了,之前的文章RocketMQ生產部署架構如何設計中,我們已經簡單的聊過了生產者是如何發送消息給Broker的。

我們簡單回顧一下這個過程。

生產者首先聲明一個Topic,然後爲了把消息存到對應的Topic中,先從NameServer拉取註冊信息獲取到Topic存放在哪個Broker中,然後就可以訪問對應的Broker發送消息了。

大體流程就是這樣,那麼這個過程中具體都發生了什麼呢,王子今天就和大家深入的探討一下這其中的奧祕。

 

什麼是MessageQueue

要弄明白生產者發送消息的原理,先要理解什麼是MessageQueue。

在生產者聲明Topic的時候,是要指定一個關鍵的參數的,就是MessageQueue,就是指定了你的Topic裏面包含幾個MessageQueue。

那麼這個MessageQueue是做什麼用的呢?

直接翻譯過來就是消息隊列,那麼就可以理解成一個Topic對應多個MessageQueue,然後把消息存放到Topic下的消息隊列中。

其實Topic、MessageQueue、Broker之間是有關聯的。

現在假設我們有一個Topic,指定了它有4個MessageQueue,那麼這個Topic在分佈式的Broker中是如何存儲的呢?

前面的文章我們就聊過,Topic的數據是分佈式存儲在多個Broker中的,如下圖:

 

那麼Topic中的一部分數據是通過什麼渠道存儲在不同的Broker集羣中的呢?

相信小夥伴們都猜到了,就是通過MessageQueue,本質上來講就是一個數據分片的機制。

假設我們的Topic中有1萬條數據,那麼可能會平均分佈到4個MessageQueue中分片存儲(這裏不是絕對的,可以根據消息寫入的策略來定)。

那麼這4個MessageQueue又是怎麼存儲在Broker上的呢?

很有可能就是每個Broker上存放兩個MessageQueue。所以MessageQueue是RocketMQ中非常關鍵的數據分片機制,實現了Topic數據的分佈式存儲。

 

生產者發送消息存入哪個MessageQueue

接下來我們思考一下,生產者發送消息的時候是如何確定存入哪個MessageQueue呢?

我們之前說過,存放消息之前,首先會從NameServer中拉取元數據,在元數據中生產者可以知道Topic有幾個MessageQueue,每個MessageQueue存放在哪個Broker集羣上。

然後呢,既然生產者知道了這些信息,我們暫時就認爲生產者會把消息均勻的發送給當前Topic下的所有MessageQueue中。

比如一共20條消息,4個MessageQueue,那麼每個MessageQueue中就存放5條消息。

至於其他的存放策略,我們之後的文章再仔細探討。

通過這樣的方式,生產者發送消息的請求就可以分佈在多臺的Broker上,那假設我們的每臺Broker都可以抗下10萬併發,兩個Broker就可以抗下20萬的併發。

同時,因爲我們的消息數據是分片式存儲在多個MessageQueue中的,MessageQueue又分佈在多個Broker集羣中,這樣就可以保證RocketMQ存儲海量消息了。

 

如果Broker發生故障怎麼辦

對於Broker發生故障這一問題,我們之前的文章已經講過了,小夥伴們可以回顧一下:Broker的主從架構是怎麼實現的?

主要使用的是4.5版本後的Dledger自動化切換主從的集羣,當MasterBroker掛掉後是可以自動實現Slave到Master的轉變的。

那麼這裏爲什麼我們還要談這個問題呢?

小夥伴們想一下,如果MasterBroker掛掉了,要實現主從切換這一過程是需要時間的。

那麼在切換的過程中,如果我們的生產者仍然發送消息過來,並且定位到了這臺掛掉的MasterBroker,不就無法正常的寫入數據了嗎。

如果我們還是按照之前說的平均分發消息到MessageQueue,那麼就會導致一段時間內訪問到故障Broker上時全部是失敗的。

對於這個問題,我們可以在生產者中開啓一個開關:sendLatencyFaultEnable=true

一旦開啓這個開關,它有個自動容錯機制。

比如訪問Broker時發現Broker響應超時或返回錯誤,那麼在之後的一段時間裏,就不會再去訪問這個Broker集羣了。

這樣的話,當Broker發生故障,一段時間內生產者就不會頻繁的訪問這個發生異常的Broker集羣了,過段時間後再去訪問。

可能這個時候我們的主從切換已經結束了,這樣再次訪問的時候就正常了。

 

總結

今天我們主要聊了聊什麼是MessageQueue,MessageQueue在RocketMQ中扮演什麼角色,生產者是如何寫消息到MessageQueue的,Broker發生故障生產者是如何保證自動容錯的。

相信小夥伴們應該會有一些收穫,那我們下期的消息中間件系列再見。

 

往期文章推薦:

什麼是消息中間件?主要作用是什麼?

常見的消息中間件有哪些?你們是怎麼進行技術選型的?

你懂RocketMQ 的架構原理嗎?

聊一聊RocketMQ的註冊中心NameServer

Broker的主從架構是怎麼實現的?

RocketMQ生產部署架構如何設計

RabbitMQ和Kafka的高可用集羣原理

RocketMQ的發送模式和消費模式

討論一下秒殺系統的技術難點與解決方案

秒殺系統中的扣減庫存和流量削峯

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章