日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

RocketMQ是JAVA兄弟們常用的消息中間件,雖說常用,但對于RocketMQ架構(gòu)經(jīng)常忘記。究其原因就2點:忙于業(yè)務(wù)開發(fā)然后長時間不看則忘了、不理解架構(gòu)設(shè)計的根本原因記不牢。本文用大白話描述架構(gòu)設(shè)計過程,牢記RocketMQ架構(gòu)。

九個問答牢記RocketMQ架構(gòu)

一、架構(gòu)的思考過程

首先,在記框架的原理和架構(gòu)時,要先把握全局的脈絡(luò),在思考為什么這么設(shè)計,最后才是思考細(xì)節(jié),這樣才能記得牢。本文通過層層追問的方式,一步步解說RocketMQ架構(gòu)設(shè)計的原因。

1.基本形態(tài)

(1) 如果你是RocketMQ的開發(fā)者,讓你來設(shè)計一個消息中間件,你會設(shè)計哪些角色?

答:起碼要設(shè)計3個角色:

  • 消息中轉(zhuǎn)站:Broker,Broker是核心,負(fù)責(zé):接受消息、存儲消息、處理消費(fèi)者的消費(fèi)請求、備份容災(zāi)等。
  • 生產(chǎn)者:Producer,生產(chǎn)消息然后投遞到Broker。
  • 消費(fèi)者:Consumer,從Broker中消費(fèi)消息。

九個問答牢記RocketMQ架構(gòu)

2.消息怎么存

(2) 有了基本形態(tài)后,我們知道,具體的消息肯定是存在Broker里,那消息在Broker里應(yīng)該怎么存儲呢?

答:這里借鑒實際生活中的案例,比如物流公司在發(fā)快遞時,發(fā)往同一個城市的快遞,肯定安排在一起,然后用同一批貨車運(yùn)往那個城市,這樣整個物流體系運(yùn)轉(zhuǎn)是最高效的。這里就用到了聚類的方式,讓相似的事物聚到一起。

同樣的,在設(shè)計怎么存儲消息時,也用到聚類的概念,我們把相同類型的消息,放到一個邏輯空間里,這個邏輯空間就是主題Topic。

九個問答牢記RocketMQ架構(gòu)

(3) 那Topic的內(nèi)部又是什么結(jié)構(gòu)呢?

答:Topic的內(nèi)部肯定是一個個的消息對象,那這些消息對象是以什么數(shù)據(jù)結(jié)構(gòu)存在一起的呢?先發(fā)的消息,盡量要保證先被消費(fèi)到,這里就用到了先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu)-隊列,這就是消息隊列MessageQueue。所以,Topic內(nèi)部是由MessageQueue組成,消息隊列內(nèi)部存放著一個個的消息對象。

九個問答牢記RocketMQ架構(gòu)

3.引入集群

(4) 我們知道Broker是RocketMQ的核心,這么重要的核心掛了怎么辦?

答:既然是RocketMQ的核心,肯定要保證高可用不能掛,所以RocketMQ 會部署多臺 Broker 組成一個集群對外提供服務(wù)。

九個問答牢記RocketMQ架構(gòu)

4.再說消息怎么存

(5) RocketMQ為了保障高可用,會部署多臺Broker組成集群,那么集群場景下有多臺機(jī)器,Topic怎么存呢?

答:我們要學(xué)習(xí)“雞蛋不能放在一個籃子里”的思想。既然是要存大量的消息,又有多臺Broker,為了分擔(dān)單臺機(jī)器性能壓力、分擔(dān)存儲容量壓力、保證數(shù)據(jù)容災(zāi),所以將不同的Topic存儲到不同的Broker里。

還是按照上面物流的例子說明,比如從北京發(fā)往南京的快遞,肯定用同一批貨車運(yùn)送,快遞少則用一輛貨車,快遞多則用多輛貨車,快遞被劃分到了多個貨車上。同樣的,RocketMQ里的Topic也是分散存儲在多臺 Broker 上的,每臺Broker上存儲的消息內(nèi)容是不同的。

(6) 如果不同的Topic存儲在不同的Broker里,可能某個topic數(shù)據(jù)太大了,出現(xiàn)數(shù)據(jù)傾斜直接干爆某個Broker怎么辦?

答:上面我們提到,Topic實際上是一個個隊列的集合,那只需要將隊列分散存儲到不同的Broker上就行了。

九個問答牢記RocketMQ架構(gòu)

(7) 如果不同的Topic分散存儲在不同的Broker里,還是有數(shù)據(jù)丟失的風(fēng)險,只不過某個topic丟失的數(shù)據(jù)變小而已,這種情況的數(shù)據(jù)容災(zāi)備份怎么做呢?

答:這時候就會用到Broker的主-從架構(gòu),Broker按角色分為Master和Slave,主從之間會定期地進(jìn)行數(shù)據(jù)同步。Master 負(fù)責(zé)響應(yīng)客戶端的讀寫請求、存儲消息、處理消費(fèi)者請求等,而 Slave 只負(fù)責(zé)同步 Master 的數(shù)據(jù)。

九個問答牢記RocketMQ架構(gòu)

5.說說NameServer

(8) Broker既然是集群,那生產(chǎn)者在投遞消息時,總得知道有哪些Broker吧,總得知道要往哪個Broker里投遞消息吧,這又要怎么做呢?

答:RocketMQ引入了NameServer的概念,NameServer相當(dāng)于大管家,RocketMQ里的所有基礎(chǔ)信息它都知道。NameServer 存儲了RocketMQ 集群的元數(shù)據(jù)。NameServer 中存放的元數(shù)據(jù)主要有:

  • 集群里都有哪些Broker?
  • 有哪些生產(chǎn)者?
  • 有哪些消費(fèi)者?
  • 集群里都有哪些 Topic?
  • 這些 Topic 的消息隊列分別存在哪些 Broker 上?

(9) 那Nameserver如何知道這些消息呢?

答:類似古時候某個人去府里當(dāng)差,當(dāng)差之前要把自己的所有信息登記在冊。同樣的,Broker、Producer、Consumer在啟動時也會將數(shù)據(jù)注冊到 NameServer。

Broker 在啟動時會將自己注冊到 NameServer 上,通過心跳持續(xù)更新元數(shù)據(jù)。同樣的,Producer、Consumer也會和NameServer建立連接、動態(tài)交互集群中的數(shù)據(jù),這樣即方便上報自己的信息和也方便獲取集群里的其他信息。

九個問答牢記RocketMQ架構(gòu)

至此,RocketMQ的架構(gòu)圖已經(jīng)成型,每一個部件這么設(shè)計的原因也很清晰。

二、總結(jié)

RocketMQ里的核心角色有4個:Broker、Producer、Consumer、NameServer,消息存儲的核心對象有2個:Topic、MessageQueue。

為了保證數(shù)據(jù)不丟失 和 數(shù)據(jù)不傾斜,同一個Topic里的MessageQueue會分散存儲在不同的Broker里。

分享到:
標(biāo)簽:RocketMQ
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定