RocketMQ是什麼(二)

2021-07-23 06:33:45 字數 3259 閱讀 9920

7.rocketmq關鍵特性

(1)單機支援1萬以上持久化佇列

1.所有資料單獨儲存到乙個commit log,完全順序寫,隨機讀。

2.對終端使用者展現的佇列實際只儲存訊息在commit log的位置資訊,並且序列方式刷盤。

這樣好處:

a、佇列輕量化,單個佇列的資料量非常少。

b、對磁碟的訪問序列化,避免磁碟競爭,不會因為佇列增加導致io wait 增高。

每個方案都有缺點,它的缺點如下:

(a)寫雖然完全是順序寫,但是讀卻變成了完全的隨機讀、

(b)讀一條訊息,會先讀consume queue,再讀commit log,增加了開銷。

(c)要保證commit log 與consume queue完全的一致,增加了程式設計的複雜度。

(2)刷盤策略

rocketmq所有的訊息都是持久化的,先寫入系統pagecache,然後刷盤,可以保證記憶體與磁碟都有乙份資料,訪問時,直接從記憶體讀取。

(a)非同步刷盤

(b)同步刷盤

同步刷盤與非同步刷盤的唯一區別是非同步刷盤寫完pagecache直接返回,而同步刷盤需要等待刷盤完成後才能返回。

同步刷盤流程如下:

(1)寫入pagecache後,執行緒等待,通知刷盤執行緒刷盤。

(2)刷盤執行緒刷盤完成後,喚醒前端等待執行緒,可能是一批執行緒。

(3)前端等待執行緒向使用者返回成功。

3.訊息查詢

(a)按照message id查詢訊息

msgid總共16位元組,包含訊息儲存主機位址,訊息commit log offset,從msgid中解析出broker的位址和commit log offset的偏移位址,然後按照儲存格式所在位置訊息buffer解析成乙個完整的訊息。

(b)按照message key查詢訊息

1.根據查詢的key的hashcode%slotnum得到具體地槽的位置(slot是最大槽數,圖中為5000000)

2.根據slotvalue(slot位置對應的值)查詢到索引項列表的最後一項(倒序排序,slotvlaue總是指向最新乙個索引項)

3.遍歷索引項列表返回查詢時間範圍內的結果集(預設一次最大返回32條記錄)

4.hash衝突:尋找key的slot位置時相當於執行了兩次雜湊函式,一次key的hash,一次key的hash值取模,因此存在兩次衝突的情況:a、key的hash值不同但模數相同,此時查詢的時候會再比較一次key的hash值(每個索引項儲存了key的hash值),過濾掉hash值不相等的項。第二種,hash值相同key不同,出於效能的考慮衝突的監測放到客戶端處理(key原始值是儲存在訊息檔案中,避免對資料檔案的解析),客戶端比較一次訊息體的可以是否相同。

5.儲存:為了節省空間索引項中儲存的時間是時間差值(儲存時間-開始時間,開始時間儲存在索引檔案頭中,整個索引檔案是定長的,結構也是固定的)

4.伺服器訊息過濾

rocketmq的訊息過濾方式有別與其他訊息中介軟體,是在訂閱時,再做過濾,先看下consumer queune結構

(1)在broker端進行message tag比對,先遍歷consume queue,如果儲存的message tag 與訂閱的message tag不符合,則跳過,繼續比對下乙個,符合則傳輸給consumer,注意,message tag是字串形式,consuemerqueue中儲存的是其對應的hashcode,比對時也是hashcode。

(2)consumer收到過濾後的訊息後,同樣也要執行在broker端的操作,但是比對的是真實的message tag字串,而不是hashcode。

為什麼過濾要這樣做?

a、message tag儲存hashcode,是為了在consume queue定長方式儲存,節約空間。

b、過濾過程中不會訪問commit log資料,可以保證堆積情況下也能高效過濾。

c、即使存在hash衝突,也可以在consumer端進行修正,保證萬無一失。、

5.長輪詢pull

rocketmq的consumer都是從broker拉訊息來消費,但是為了做到實時收訊息,rocketmq使用長輪詢方式,可以保證訊息實時性同push方式一致,這種長輪詢方式類似於web qq收發訊息機制,

6.順序訊息原理

順序訊息缺陷:

傳送順序訊息無法利用集群failover特性

消費順序的並行度依賴於佇列數量

佇列熱點問題,個別佇列由於雜湊不均導致訊息過多,消費速度跟不上,產生訊息堆積問題

遇到訊息失敗的訊息,無法跳過,當前對列消費暫停

7.事務訊息

8.傳送訊息負載均衡

5個佇列可以部署在一台機器上,也可以分別部署在5臺不同的機器上,傳送訊息通過輪詢佇列的方式傳送,每個佇列接收平均的訊息量,通過增加機器,可以水平擴充套件佇列容量。也可以自定義方式選擇發往哪個佇列。

9.訂閱訊息負載均衡

如圖,若有5個佇列,2個consumer,那麼第乙個consumer消費3個佇列,第二consumer消費2個佇列。這樣可以達到平均消費的目的,可以水平擴充套件consumer來提高消費能力,但是consumer數量要小於等於佇列數量,如果consumer超過佇列數量,那麼多餘的consumer將不能消費訊息

訊息堆積問題

RocketMQ 是什麼 專業術語

github 上關於 rocketmq 的介紹 rcoketmq 是一款低延遲 高可靠 可伸縮 易於使用的訊息中介軟體。具有以下特性 支援發布 訂閱 pub sub 和點對點 p2p 訊息模型 在乙個佇列中可靠的先進先出 fifo 和嚴格的順序傳遞 支援拉 pull 和推 push 兩種訊息模式 單...

Sqoop 是什麼?(二)

sqoop 是傳統資料庫與 hadoop 之間資料同步的工具,它是 hadoop 發展到一定程度的必然產物,它主要解決的是傳統資料庫和hadoop之間資料的遷移問題。sqoop 是連線傳統關係型資料庫和 hadoop 的橋梁。它包括以下兩個方面 1 將關係型資料庫的資料匯入到 hadoop 及其相關...

MQ 為什麼選擇RocketMQ?

提到mq,可能很多朋友都有多耳聞,很多大公司都在使用這種技術。就小編而言,聽說使用mq可以進行秒殺的操作,而且使用十分的方便,效率十分的高。以前小編也做過關於秒殺的技術,就是使用悲觀鎖對dao進行操作,通過加鎖使得執行緒單一。但是上億條資料訪問資料庫也是對資料有很大的壓力的。所以我們可以在dao和資...