RocketMQ讀書筆記5——消息隊列的核心機制


【Broker簡述】

Broker是RocketMQ的核心,大部分“重量級”的工作都是由Broker完成的,包括:

1.接受Producer發過來的消息;

2.處理Consumer的消費信息請求;

3.消息的持久化存儲;

4.消息的HA機制;

5.服務端的過濾功能。

 

【消息存儲】

分布式消息隊列因為有高可靠性的要求,所以數據要通過磁盤進行持久化存儲。

RocketMQ的消息是存儲到磁盤上的,這樣既可以保證斷電后恢復,也可以不受內存大小的限制。

[ 磁盤存儲的“快”——順序寫 ] 

 磁盤存儲,使用得當,磁盤的速度完全可以匹配上網絡的數據傳輸速度,目前的高性能磁盤,順序寫速度可以達到600MB/s,超過了一般網卡的傳輸速度。

[ 磁盤存儲的“慢”——隨機寫 ]

磁盤的隨機寫的速度只有100KB/s,和順序寫的性能差了好幾個數量級。

 

【消息的存儲結構】

RocketMQ的存儲是由ConsumeQueue和CommitLog配合完成的。

 

RocketMQ的存儲結構圖

CommitLog以物理文件的方式存放,每台Broker上的CommitLog被本機器所有ConsumeQueue共享。

在CommitLog,一個消息的存儲長度是不固定的,RocketMQ采用了一些機制,盡量向CommitLog中順序寫,但是隨即讀

 [ 存儲機制這樣設計的好處——順序寫,隨機讀 ]

1.CommitLog順序寫,可以大大提高寫入的效率;

2.雖然是隨機讀,但是利用package機制,可以批量地從磁盤讀取,作為cache存到內存中,加速后續的讀取速度。

3.為了保證完全的順序寫,需要ConsumeQueue這個中間結構,因為ConsumeQueue里只存儲偏移量信息,所以尺寸是有限的。在實際情況中,大部分ConsumeQueue能夠被全部讀入內存,所以這個中間結構的操作速度很快,可以認為是內存讀取的速度。

[ 如何保證CommitLog和ConsumeQueue的一致性? ]

CommitLog里存儲了Consume Queues、Message Queue、Tag等所有信息,即使ConsumeQueue丟失,也可以通過commitLog完全恢復出來。

 

[ RocketMQ的Broker機器磁盤上的文件存儲結構 ]

 

【高可用機制】

RocketMQ分布式集群通過Master和Slave機制達到高可用性。

[ 配置中如何區分Master和Slave? ]

在Broker的配置文件中

Master配置:

brokerId=0 brokerRole=SYNC_MASTER  

Slave配置:

brokerId=1    #slave的brokerId>0 brokerRole=SLAVE 

Producer只能向Master角色的Broker寫消息。

Consumer可以從Master和Slave角色的Broker讀消息。

 

[ 如何提高Producer和Consumer的高可用性? ]

1.Consumer端的高可用

在Consumer配置文件中,不需要設置是從Master還是Slave讀,當Master不可用或者繁忙時,Consumer會被自動切換到從Slave讀。

有了自動切換Consumer的機制,當一個Master角色的Broker出現故障,Consumer依然可以從Slave讀取消息,不影響Consumer程序。

2.Producer端的高可用性

創建Topic的時候,把Topic的多個MessageQueue創建在多個Broker組上(Broker組:相同的Broker名稱,不同的BrokerId組成一個Broker組。),這樣當一個Broker組的Master不可用時,其他組的Master依然可用,Producer依然可以發消息。

[ RocketMQ是否支持把Slave自動轉成Master? ]

目前不支持,如果機器資源不足,需要把Slave轉成Master,則要手動停止Slave角色的Broker,更改配置文件,用新的配置文件啟動Broker。

 

【重點:同步刷盤和異步刷盤】

[ 同步刷盤 ]

 

[ 異步刷盤 ]

[ 同步刷盤或異步刷盤的配置方式 ]

通過Broker配置文件中的flushDiskType參數設置。

flushDiskType=SYNC_FLUSH #同步刷盤
flushDiskType
=ASYNC_FLUSH #異步刷盤

 

【 重點:同步復制和異步復制 】

如果一個Broker組有Master和Slave,消息需要從Master復制到Slave,有同步復制和異步復制兩種方式。

[ 同步、異步復制的優缺點對比 ]

[ 同步異步的配置方式 ]

在Broker的配置文件中的brokerRole參數進行配置:

brokerRole=ASYNC_MASTER #異步復制 brokerRole=SYNC_MASTER #同步復制 brokerRole=SALVE         #對於Slave,只有一個參數可選

 

【小結:推薦的配置方式】

實際業務場景中,要合理設置刷盤方式和主從復制方式。

特別是刷盤方式中的SYNC_FLUSH方式,如果業務頻繁地觸發寫操作,會明顯降低性能。

通常情況下,會把Master和Slave的Broker均配置成ASYNC_FLUSH異步刷盤方式。

主從之間配置成SYNC_MASTER同步復制方式。

即:異步刷盤+同步復制

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM