RocketMQ保證訊息不丟失

2021-10-10 07:31:29 字數 1193 閱讀 1640

分別從producer傳送機制、broker的持久化機制,以及消費者的offset機制來最大程度保證訊息不易丟失

從producer的視角來看:如果訊息未能正確的儲存在mq中,或者消費者未能正確的消費到這條訊息,都是訊息丟失。

從broker的視角來看:如果訊息已經存在broker裡面了,如何保證不會丟失呢(宕機、磁碟崩潰)

從consumer的視角來看:如果訊息已經完成持久化了,但是consumer取了,但是未消費成功且沒有反饋,就是訊息丟失

從producer分析:如何確保訊息正確的傳送到了broker?

預設情況下,可以通過同步的方式阻塞式的傳送,check sendstatus,狀態是ok,表示訊息一定成功的投遞到了broker,狀態超時或者失敗,則會觸發預設的2次重試。此方法的傳送結果,可能broker儲存成功了,也可能沒成功

採取事務訊息的投遞方式,並不能保證訊息100%投遞成功到了broker,但是如果訊息傳送ack失敗的話,此訊息會儲存在commitlog當中,但是對consumerqueue是不可見的。可以在日誌中檢視到這條異常的訊息,嚴格意義上來講,也並沒有完全丟失

rocketmq支援 日誌的索引,如果一條訊息傳送之後超時,也可以通過查詢日誌的api,來check是否在broker儲存成功

從broker分析:如果確保接收到的訊息不會丟失?

訊息支援持久化到commitlog裡面,即使宕機後重啟,未消費的訊息也是可以載入出來的

broker自身支援同步刷盤、非同步刷盤的策略,可以保證接收到的訊息一定儲存在本地的記憶體中

broker集群支援 1主n從的策略,支援同步複製和非同步複製的方式,同步複製可以保證即使master 磁碟崩潰,訊息仍然不會丟失

從cunmser分析:如何確保拉取到的訊息被成功消費?

消費者可以根據自身的策略批量pull訊息

consumer自身維護乙個持久化的offset(對應messagequeue裡面的min offset),標記已經成功消費或者已經成功發回到broker的訊息下標

如果consumer消費失敗,那麼它會把這個訊息發回給broker,發回成功後,再更新自己的offset

如果consumer消費失敗,發回給broker時,broker掛掉了,那麼consumer會定時重試這個操作

如果consumer和broker一起掛了,訊息也不會丟失,因為consumer 裡面的offset是定時持久化的,重啟之後,繼續拉取offset之前的訊息到本地

rocketmq如何保證訊息不丟失

一 大體可以從三方面來說 分別從producer傳送機制 broker的持久化機制,以及消費者的offset機制來最大程度保證訊息不易丟失 從producer的視角來看 如果訊息未能正確的儲存在mq中,或者消費者未能正確的消費到這條訊息,都是訊息丟失。從broker的視角來看 如果訊息已經存在bro...

RocketMQ如何保證訊息不丟失(訊息可靠性)

為什麼說rocketmq更適用於業務型的訊息中介軟體,因為它能夠保證訊息不丟失且帶有事務訊息。先來看一張rocketmq集群部署結構 其中name server主要是提供路由資訊,這裡暫時忽略,大致流程為 producer 生產者生產訊息 broker 儲存訊息 consumer 消費訊息 接下來我...

kafka保證訊息不丟失

一 消費端保證訊息不丟失 消費端從broker取到訊息以後,先處理業務邏輯,然後再手動提交,這樣就可以避免消費端訊息丟失。二 生產端訊息不丟失 首先是設定每個訊息分割槽的副本,一本是幾個broker就配置幾個分割槽,然後設定如下,保證生產這生產的訊息傳送到broker時,不但leader確認收到訊息...