你懂RocketMQ 的架構原理嗎?

 

前言

前面我們跟大家聊了聊什麼是消息中間件,以及哪些場景使用哪些消息中間件更加合適。

我們瞭解到RocketMQ是java語言開發的,我們能更深入的閱讀源碼瞭解它的底層原理,而且它具有優秀的消息中間件高級功能。再換個角度想,對於面試MQ來說,其實我們需要深入的瞭解一箇中間件來與面試官聊,其他的中間件瞭解基本原理就可以了(後文會講解)。

所以接下來我們就以RocketMQ爲敲門磚,一點一點了解MQ的奧祕。

 

今天我們來聊一聊RocketMQ 的架構原理

 

RocketMQ是如何承受高併發的呢?

先聊一聊RocketMQ是怎麼實現高併發的呢,我們先從它的單機模式說起。

之前我們說過,單機的RocketMQ可以承受十萬多的併發,那麼這個時候如果業務上突然出現了幾十萬的併發量,這時候如何處理呢。

沒關係,RocketMQ是支持集羣化部署的,部署多臺機器,每臺機器承受十萬的併發不就可以了嗎。

 

其實這就是RocketMQ承受高併發的原理,當然,關於它是如何將流量分配到集羣的每臺機器上,這個問題以後會單獨講解,今天主要聊一聊總體的架構原理。

 

RocketMQ是如何存儲大量消息數據的呢?

現在我們來看看,RocketMQ是如何持久化數據的。MQ收到大量消息後,這些消息是不能實時消費掉的,所以就會存在消息的積壓,同時爲了保證消息不丟失,所以持久化是很必要的。

而對於海量的消息,單獨一臺機器是存儲不下的。退一步來講,就算能夠存儲的下,一旦這臺機器壞掉,數據就丟失了,無法保證消息的可靠性。

其實對於消息數據的持久化,和高併發的解決方案是類似的,看下圖:

 

 

假設一共有一萬條消息要發送給MQ,分散到10臺機器,可能每臺機器就會收到1000條左右的消息,這時候MQ會把發送到自己機器的消息保存到自己的磁盤裏,其實就是數據的分佈式存儲。

所謂分佈式存儲就是把數據分散到多臺機器存儲,可以通過擴展機器存儲海量數據。

 

如果RocketMQ掛掉了怎麼辦?

在討論這個問題之前,我們先引入一個新的概念,Broker。

Broker是RocketMQ的核心模塊,負責接收並存儲消息,同時提供Push/Pull接口來將消息發送給consumer。Consumer可選擇從Master或者Slave讀取數據。多個主/從組成Broker集羣,集羣內的Master節點之間不做數據交互。Broker同時提供消息查詢的功能,可以通過MessageID和messageKey來查詢消息。Borker會將自己的topic配置信息實時同步到NameServer。
 
一定有小夥伴會問,上邊又出現了一個新名詞NameServer,那什麼是NameServer呢?不要急,下一章節會有介紹。
 
至於Producer(生產者)、Consumer(消費者),相信小夥伴們已經瞭解了,就是消息的生產服務和消費服務,不多做介紹。
 
瞭解了這些概念後我們再重新討論我們的主題,RocketMQ掛掉了怎麼辦
 
Rocket對此的解決方案是Broker主從架構以及多副本策略,上邊介紹Broker的時候我們也說了,它是有主從的,我們看下圖:
 

 

 Master Broker收到消息後會同步給Slave Broker,這樣Slave Broker就有了一份副本數據,

這樣,當RocketMQ掛掉了一個Broker,還有一份副本Broker可以繼續提供服務,這就保證了系統的高可用性。

 

如何知道我該訪問哪個Broker?
 
上邊我們發現,Broker可以部署一個龐大的集羣,還可以部署多個Slave做副本實現高可用,那麼對於要調用MQ服務的系統來講,是如何知道它應該訪問那個Broker的呢?
 
這時候就要談談NameServer了。
 
NameServer可以看作是RocketMQ的註冊中心,它也是可以獨立部署集羣的,它管理兩部分數據:集羣的Topic-Queue的路由配置;Broker的實時配置信息。其它模塊通過NameServer提供的接口獲取最新的topic配置和路由信息。
 
玩過Spring Cloud分佈式系統的小夥伴們是不是覺得它很熟悉,沒錯它就是註冊中心,功能類似於Euraka,每個Broker都會向它註冊自己的信息,我們看下圖:

 

 對於系統而言(無論是生產者還是消費者),要調用MQ服務,首先會去NameServer中獲取路由信息,也會知道系統中有哪些Broker正在提供服務,從而確定自己應該訪問哪臺機器上的Broker。

RoketMQ的基本架構原理就是這樣了,當然這只是個總體的架構,很多細節的東西都可以去深入探索,歡迎小夥伴們關注後續的文章,和HUC王子一起細嚼慢嚥,探索消息中間件的樂趣吧。

 

往期文章推薦:

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

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

我的博客即將同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2dl7u9oadykgw

 

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