前言
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發生故障生產者是如何保證自動容錯的。
相信小伙伴們應該會有一些收獲,那我們下期的消息中間件系列再見。
往期文章推薦: