前言
本篇學(xué)習(xí)了解RocktMq入門核心基本的原理概念以及記錄一些基本解析劝评。
消息的存儲(chǔ)結(jié)構(gòu)
生產(chǎn)者發(fā)送后趴拧,在消費(fèi)者消費(fèi)前的存儲(chǔ)結(jié)構(gòu)圖
consume Queue 存在消息在CommitLog中的位置
- 1床牧、 消費(fèi)端采用零拷貝
- 2、Commit log存儲(chǔ)消息實(shí)體(真實(shí)數(shù)據(jù))。順序?qū)懛ΓS機(jī)讀索赏。
- 3盼玄、consume Queue 記錄在CommitLog位置,類似于索引文件潜腻,一對(duì)多的關(guān)系
- 4埃儿、每一個(gè)topic,message queue 都對(duì)應(yīng)一個(gè)Consume Queue融涣,具體的值海是讀取commit log消息本身桥氏。
-5吹菱、Index 消息屬性檢索消息们衙,引入ConsumeQueue文件解決了基于topic查找消息的問題
-6瞬逊、CommitLog里存儲(chǔ)了Consume Queues、Message Queue忽你、Tag等所有信息幼东,即使ConsumeQueue丟失,也可以通過commitLog完全恢復(fù)出來
同步刷盤與異步刷盤
RocketMQ消息存儲(chǔ):內(nèi)存 + 磁盤存儲(chǔ)科雳,兩種刷盤方式
存儲(chǔ)與讀寫是基于JDK NIO的內(nèi)存映射機(jī)制(MappedByteBuffer)根蟹,消息存儲(chǔ)時(shí)首先將消息追加到文件內(nèi)存映射(commit操作),再根據(jù)配置的刷盤策略在不同時(shí)間進(jìn)行刷寫到磁盤(flush操作)炸渡。
同步刷盤
同步刷盤即持久化成功后才向客戶端返回成功娜亿。以犧牲寫入性能為代價(jià)。
異步刷盤
異步刷盤是指 Broker 將消息存儲(chǔ)到頁緩存后就立即返回成功蚌堵,然后開啟一個(gè)異步線程定時(shí)將內(nèi)存中的數(shù)據(jù)寫入磁盤买决,默認(rèn)間隔時(shí)間 500ms。
高可用機(jī)制
- 集群有兩個(gè)角色吼畏,Master-Salve
- 根據(jù)BorkerId區(qū)分主從節(jié)點(diǎn)
- Master讀寫督赤,Slave只寫
- 當(dāng)Master繁忙或者不可用時(shí),可以自動(dòng)切換到Slave讀取消息
NameServer協(xié)調(diào)者
對(duì)于一個(gè)消息隊(duì)列集群來說是整個(gè)集群的狀態(tài)服務(wù)器泻蚊,系統(tǒng)由很多臺(tái)機(jī)器組成躲舌,每個(gè)機(jī)器的角色、IP 地址都不相同性雄,而且這些信息是變動(dòng)的没卸。這種情況下羹奉, 如果一個(gè)新的Producer 或Consumer 加入,怎么配置連接信息呢约计?NameServer 的存在主要是為了解決這類問題诀拭,由NameServer 維護(hù)這些配置信息、狀態(tài)信息煤蚌,其他角色都通過NameServer 來協(xié)同執(zhí)行
- NameServer部署耕挨、相互獨(dú)立
Nameserver是一個(gè)獨(dú)立的元數(shù)據(jù)管理組件,它需要獨(dú)立運(yùn)行尉桩,并且與Broker和Consumer分開部署筒占。通常情況下,建議在集群中至少部署兩個(gè)Nameserver節(jié)點(diǎn)蜘犁,以確保高可用性翰苫。 - NameServer 維護(hù)的主要信息:
- topic-》List<queueData> 某個(gè)Broker的隊(duì)列
- 為什么不用Zookpper
- NameServer 輕量級(jí),代碼行數(shù)1000多行
- RocketMQ追求的是AP沽瘦,不是CP革骨,需要高可用
- zk是CP,雖然有數(shù)據(jù)共享析恋,每個(gè)節(jié)點(diǎn)數(shù)據(jù)會(huì)一致性,但zk集群掛掉了一半以上就不能用
- NameServer是AP盛卡,節(jié)點(diǎn)間不通信助隧,這樣會(huì)導(dǎo)致節(jié)點(diǎn)間數(shù)據(jù)信息會(huì)發(fā)生短暫的不一致,但每個(gè)broker都會(huì)定時(shí)向所有nameserver上報(bào)路由信息和心跳滑沧;當(dāng)某個(gè)broker下線了并村,NameServer也會(huì)延時(shí)30s才知道,而且不會(huì)通知客戶端(生產(chǎn)和消費(fèi)者)滓技,只能靠客戶端自己來拉哩牍,RocketMQ 是靠消息重試機(jī)制解決這個(gè)問題的,所以是最終一致性令漂;但NameServer集群只要有一個(gè)節(jié)點(diǎn)就可用膝昆;
結(jié)尾
這個(gè)文章主要也是入門級(jí)的了解RocketMQ的基本核心原理概念,從消息的基本存儲(chǔ)結(jié)構(gòu)叠必,以及刷盤的兩種方式河NameServer協(xié)調(diào)者的作用荚孵。