java開(kāi)發(fā)RocketMQ消息中間件原理基礎(chǔ)詳解
RocketMQ 是什么
Github 上關(guān)于 RocketMQ 的介紹:
RcoketMQ 是一款低延遲、高可靠、可伸縮、易于使用的消息中間件。具有以下特性:
- 支持發(fā)布/訂閱(Pub/Sub)和點(diǎn)對(duì)點(diǎn)(P2P)消息模型
- 在一個(gè)隊(duì)列中可靠的先進(jìn)先出(FIFO)和嚴(yán)格的順序傳遞
- 支持拉(pull)和推(push)兩種消息模式
- 單一隊(duì)列百萬(wàn)消息的堆積能力
- 支持多種消息協(xié)議,如 JMS、MQTT 等
- 分布式高可用的部署架構(gòu),滿足至少一次消息傳遞語(yǔ)義
- 提供 docker 鏡像用于隔離測(cè)試和云集群部署
- 提供配置、指標(biāo)和監(jiān)控等功能豐富的 Dashboard
對(duì)于這些特性描述,大家簡(jiǎn)單過(guò)一眼就即可,深入學(xué)習(xí)之后自然就明白了。
專業(yè)術(shù)語(yǔ)
Producer
消息生產(chǎn)者,生產(chǎn)者的作用就是將消息發(fā)送到 MQ,生產(chǎn)者本身既可以產(chǎn)生消息,如讀取文本信息等。也可以對(duì)外提供接口,由外部應(yīng)用來(lái)調(diào)用接口,再由生產(chǎn)者將收到的消息發(fā)送到 MQ。
Producer Group
生產(chǎn)者組,簡(jiǎn)單來(lái)說(shuō)就是多個(gè)發(fā)送同一類消息的生產(chǎn)者稱之為一個(gè)生產(chǎn)者組。在這里可以不用關(guān)心,只要知道有這么一個(gè)概念即可。
Consumer
消息消費(fèi)者,簡(jiǎn)單來(lái)說(shuō),消費(fèi) MQ 上的消息的應(yīng)用程序就是消費(fèi)者,至于消息是否進(jìn)行邏輯處理,還是直接存儲(chǔ)到數(shù)據(jù)庫(kù)等取決于業(yè)務(wù)需要。
Consumer Group
消費(fèi)者組,和生產(chǎn)者類似,消費(fèi)同一類消息的多個(gè) consumer 實(shí)例組成一個(gè)消費(fèi)者組。
Topic
Topic 是一種消息的邏輯分類,比如說(shuō)你有訂單類的消息,也有庫(kù)存類的消息,那么就需要進(jìn)行分類,一個(gè)是訂單 Topic 存放訂單相關(guān)的消息,一個(gè)是庫(kù)存 Topic 存儲(chǔ)庫(kù)存相關(guān)的消息。
Message
Message 是消息的載體。一個(gè) Message 必須指定 topic,相當(dāng)于寄信的地址。Message 還有一個(gè)可選的 tag 設(shè)置,以便消費(fèi)端可以基于 tag 進(jìn)行過(guò)濾消息。也可以添加額外的鍵值對(duì),例如你需要一個(gè)業(yè)務(wù) key 來(lái)查找 broker 上的消息,方便在開(kāi)發(fā)過(guò)程中診斷問(wèn)題。
Tag
標(biāo)簽可以被認(rèn)為是對(duì) Topic 進(jìn)一步細(xì)化。一般在相同業(yè)務(wù)模塊中通過(guò)引入標(biāo)簽來(lái)標(biāo)記不同用途的消息。
Broker
Broker 是 RocketMQ 系統(tǒng)的主要角色,其實(shí)就是前面一直說(shuō)的 MQ。Broker 接收來(lái)自生產(chǎn)者的消息,儲(chǔ)存以及為消費(fèi)者拉取消息的請(qǐng)求做好準(zhǔn)備。
Name Server
Name Server 為 producer 和 consumer 提供路由信息。
RocketMQ 架構(gòu)
有四個(gè)集群,分別是 NameServer 集群、Broker 集群、Producer 集群和 Consumer 集群:
NameServer: 提供輕量級(jí)的服務(wù)發(fā)現(xiàn)和路由。 每個(gè) NameServer 記錄完整的路由信息,提供等效的讀寫(xiě)服務(wù),并支持快速存儲(chǔ)擴(kuò)展。
Broker: 通過(guò)提供輕量級(jí)的 Topic 和 Queue 機(jī)制來(lái)處理消息存儲(chǔ),同時(shí)支持推(push)和拉(pull)模式以及主從結(jié)構(gòu)的容錯(cuò)機(jī)制。
Producer:生產(chǎn)者,產(chǎn)生消息的實(shí)例,擁有相同 Producer Group 的 Producer 組成一個(gè)集群。
Consumer:消費(fèi)者,接收消息進(jìn)行消費(fèi)的實(shí)例,擁有相同 Consumer Group 的
Consumer 組成一個(gè)集群。
簡(jiǎn)單說(shuō)明一下圖中箭頭含義,從 Broker 開(kāi)始,Broker Master1 和 Broker Slave1 是主從結(jié)構(gòu),它們之間會(huì)進(jìn)行數(shù)據(jù)同步,即 Date Sync。同時(shí)每個(gè) Broker 與
NameServer 集群中的所有節(jié)
點(diǎn)建立長(zhǎng)連接,定時(shí)注冊(cè) Topic 信息到所有 NameServer 中。
Producer 與 NameServer 集群中的其中一個(gè)節(jié)點(diǎn)(隨機(jī)選擇)建立長(zhǎng)連接,定期從 NameServer 獲取 Topic 路由信息,并向提供 Topic 服務(wù)的 Broker Master 建立長(zhǎng)連接,且定時(shí)向 Broker 發(fā)送心跳。Producer 只能將消息發(fā)送到 Broker master,但是 Consumer 則不一樣,它同時(shí)和提供 Topic 服務(wù)的 Master 和 Slave
建立長(zhǎng)連接,既可以從 Broker Master 訂閱消息,也可以從 Broker Slave 訂閱消息。
RocketMQ 集群部署模式
單 master 模式
也就是只有一個(gè) master 節(jié)點(diǎn),稱不上是集群,一旦這個(gè) master 節(jié)點(diǎn)宕機(jī),那么整個(gè)服務(wù)就不可用,適合個(gè)人學(xué)習(xí)使用。
多master 模式
多個(gè) master 節(jié)點(diǎn)組成集群,單個(gè) master 節(jié)點(diǎn)宕機(jī)或者重啟對(duì)應(yīng)用沒(méi)有影響。
優(yōu)點(diǎn):所有模式中性能最高
缺點(diǎn):?jiǎn)蝹€(gè) master 節(jié)點(diǎn)宕機(jī)期間,未被消費(fèi)的消息在節(jié)點(diǎn)恢復(fù)之前不可用,消息的實(shí)時(shí)性就受到影響。
注意:使用同步刷盤(pán)可以保證消息不丟失,同時(shí) Topic 相對(duì)應(yīng)的 queue 應(yīng)該分布在集群中各個(gè)節(jié)點(diǎn),而不是只在某各節(jié)點(diǎn)上,否則,該節(jié)點(diǎn)宕機(jī)會(huì)對(duì)訂閱該 topic 的應(yīng)用造成影響。
多 master 多 slave 異步復(fù)制模式
在多 master 模式的基礎(chǔ)上,每個(gè) master 節(jié)點(diǎn)都有至少一個(gè)對(duì)應(yīng)的 slave。master
節(jié)點(diǎn)可讀可寫(xiě),但是 slave 只能讀不能寫(xiě),類似于 mysql 的主備模式。
優(yōu)點(diǎn): 在 master 宕機(jī)時(shí),消費(fèi)者可以從 slave 讀取消息,消息的實(shí)時(shí)性不會(huì)受影響,性能幾乎和多 master 一樣。
缺點(diǎn):使用異步復(fù)制的同步方式有可能會(huì)有消息丟失的問(wèn)題。
多 master 多 slave 同步雙寫(xiě)模式
同多 master 多 slave 異步復(fù)制模式類似,區(qū)別在于 master 和 slave 之間的數(shù)據(jù)同步方式。
優(yōu)點(diǎn):同步雙寫(xiě)的同步模式能保證數(shù)據(jù)不丟失。
缺點(diǎn):發(fā)送單個(gè)消息 RT 會(huì)略長(zhǎng),性能相比異步復(fù)制低10%左右。
刷盤(pán)策略:同步刷盤(pán)和異步刷盤(pán)(指的是節(jié)點(diǎn)自身數(shù)據(jù)是同步還是異步存儲(chǔ))
同步方式:同步雙寫(xiě)和異步復(fù)制(指的一組 master 和 slave 之間數(shù)據(jù)的同步)
注意:要保證數(shù)據(jù)可靠,需采用同步刷盤(pán)和同步雙寫(xiě)的方式,但性能會(huì)較其他方式低。
以上就是java開(kāi)發(fā)RocketMQ消息中間件基礎(chǔ)詳解的詳細(xì)內(nèi)容,更多關(guān)于RocketMQ消息中間件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決@Validated注解無(wú)效,嵌套對(duì)象屬性的@NotBlank無(wú)效問(wèn)題
這篇文章主要介紹了解決@Validated注解無(wú)效,嵌套對(duì)象屬性的@NotBlank無(wú)效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
詳解Spring MVC攔截器實(shí)現(xiàn)session控制
這篇文章主要介紹了詳解Spring MVC攔截器實(shí)現(xiàn)session控制,使用session監(jiān)聽(tīng),重復(fù)登錄后,強(qiáng)制之前登錄的session過(guò)期。有興趣的可以了解一下。2017-01-01
詳解springboot設(shè)置默認(rèn)參數(shù)Springboot.setDefaultProperties(map)不生效解決
這篇文章主要介紹了詳解springboot設(shè)置默認(rèn)參數(shù)Springboot.setDefaultProperties(map)不生效解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
java數(shù)字和中文算數(shù)驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了java數(shù)字和中文算數(shù)驗(yàn)證碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
java累加和校驗(yàn)實(shí)現(xiàn)方式16進(jìn)制(推薦)
下面小編就為大家?guī)?lái)一篇java累加和校驗(yàn)實(shí)現(xiàn)方式16進(jìn)制(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
mybatis-generator-gui 工具使用(圖形化工具)
基于 mybatis generator 開(kāi)發(fā)一款界面工具, 本工具可以使你非常容易及快速生成 Mybatis 的 Java POJO 文件及數(shù)據(jù)庫(kù) Mapping 文件。本文重點(diǎn)給大家介紹mybatis-generator-gui 工具使用,感興趣的朋友一起看看吧2022-03-03
SpringBoot Maven打包失敗報(bào):class lombok.javac.apt.Lombo
最新項(xiàng)目部署的時(shí)候,出現(xiàn)了一個(gè)maven打包失敗的問(wèn)題,報(bào):class lombok.javac.apt.LombokProcessor錯(cuò)誤,所以本文給大家介紹了如何解決SpringBoot Maven 打包失?。篶lass lombok.javac.apt.LombokProcessor 錯(cuò)誤,需要的朋友可以參考下2023-12-12
Java實(shí)現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址
這篇文章主要介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的參考價(jià)值,快跟隨小編一起學(xué)習(xí)一下吧2022-06-06

