RocketMQ如何保證訊息的可靠性?

時間 2021-05-30 00:39:23

1樓:中介軟體興趣圈

RocketMQ如何保證訊息的可靠性,我覺得可以從訊息傳送、訊息消費兩個方面進行展開分析。

講到訊息可靠性就必然會提到訊息丟失,明確訊息丟失的語義非常重要:

從訊息傳送的視角來看訊息丟失:Broker服務端向客戶端返回傳送成功後的這些訊息,必須保證在一定時間範圍內可以查詢,在客戶端呼叫訊息傳送API,但返回失敗,這些訊息就不能是丟失,因為服務端並未承諾訊息已成功儲存。

RocketMQ在4.5.0版本之前,主要是基於訊息的同步刷盤、同步複製來保證訊息的絕對可靠性。

通過同步刷盤、同步複製這種模式,可以做到訊息的絕對可靠,但於此帶來的是就是會有效能損耗。

在RocketMQ4.5.0版本之後,RocketMQ引入了多副本機制,即引用了Raft協議實現多個副本之間資料的強一致性,來實現資料的可靠性,此機制有點類似Kafka,其機制如下圖所示:

其中引入3個節點,實現資料的複製,內部基於Raft協議,只要集群中超過半數節點寫入成功,則成功。

值得注意的是,基於多副本模式,並不要求資料同步刷寫到磁碟,而是寫入pagecache就算寫入成功,雖然寫入pagecache,如果斷電,還是存在資料丟失的盡可能性,通過多個來規避單個節點的故障,但如果整個機房斷電,這種方式還不能100%保證。

上面講述的是訊息儲存方面,當然RocketMQ在訊息傳送時也提供了高可用機制,即訊息傳送重試與故障Broker規避機制來保證。

所謂的訊息消費不丟失訊息,就是儲存在Broker中的訊息,至少要能被成功消費一次

RocketMQ在訊息消費時採用了ACK機制,即訊息客戶端從Broker拉取訊息到消費端,只有訊息消費端成功將訊息消費,才會傳送ACK到Broker,broker才會認為該訊息消費成功,保證訊息不丟失。而且訊息在消費時,是採取最小位點提交機制,說明如下:

舉例說明:拉取執行緒從broker拉取了8條訊息,到執行緒池中消費,其中 thread-1執行緒在消費msg1,thread-2在消費訊息msg2,thread3消費訊息msg3,此時如何thred3先消費完msg3,但thread1,thread2還未處理完msg1、msg2,那thread-1是向Broker反饋msg3的偏移量?

這個時候為了保證訊息不丟失,儘管thread3先將msg3消費完成,但處理佇列中的msg1還沒有消費成功,此時thread3向broker提交位點時是將msg1的偏移量匯報,當msg1,msg2消費完成時,上報的微店就是msg4了,這樣保證訊息不丟失。

但上述機制會帶來訊息重複消費,例如當thred3將msg3消費完成,然後向服務端匯報進度為msg1,然後客戶端重啟,將重新從msg1開始消費,msg3就被重複拉取,重複處理,所謂消費端需要實現冪等。

RocketMQ實戰與原理專欄

kafka分布式的情況下,如何保證訊息的順序

瀟湘夜雨 由於問題比較寬泛,需要針對不同場景來分析,以下所有的分析都是基於同乙個partition下的場景細化,多partition下無法保障訊息的順序性,但是碰到如下場景還是需要調整引數。場景一 設定了retries 0,並且max.in.flight.requests.per.connectio...

天生素食的兒童如何保證營養?

已重置 只是純素食做到營養均衡的難度相對較大,所以要多吃點豆類什麼的。孩子現在還小,不一定大點口味會不會改變,以後有可能也會愛上吃肉。喝牛奶也是可以的,我覺得只要適量對孩子營養的攝取是有好處的。 多攝入植物蛋白就可以了,豆奶,豆腐,豆皮兒。奶製品致癌這個是謠言啊,每過一陣兒就傳一傳,別相信就好了。我...

如何保證ppt的風格統一

統一字型字型大小 建立配色方案,顏色盡量少 統一排版布局的格式 每頁要有統一的元素,並在相同位置,比如標題 logo 頁碼 辦公達人 所謂統一,也即一致,不過是相同,不過是元素重複。總結了幾點 01 保持一定的版面結構在所有頁面中,幻燈片需要保持一定的版面結構,為頁面的排版提供參考。02 保持字型搭...