我們把訊息中介軟體當成乙個快遞中轉站,思考兩個問題:
快遞如何在中轉站不丟失;
派件員在派件的過程中丟失了快遞,收件人沒收到,該怎麼解決。
等同於生產者將訊息投遞到rabbitmq,如果此時rabbitmq宕機了,訊息還沒傳送給消費者,如何確保訊息在伺服器重啟後還能恢復;
rabbitmq推送訊息給消費者,如何確保消費者接收到訊息並成功消費。
【答案】進行持久化,包括佇列持久化和訊息持久化,將訊息持久化到rabbitmq磁碟檔案中。
channel.queuedeclare(
"warehouse_schedule_delivery",
true, //支援持久化
false,
false,
null);
channel.basicpublish(
"","warehouse_schedule_delivery",
messageproperties.persistent_text_plain,
message.getbytes()
);//生產者將傳送去rabbitmq的訊息,在rabbitmq中進行持久化
由於rabbitmq消費者端預設開啟了自動ack機制,消費者接收到訊息,會立刻想rabbitmq傳送確認訊息,rabbitmq接收到ack後,對訊息進行刪除,如果此時消費者還沒來得及消費,訊息就會丟失,所以我們需要將消費者端的自動ack關閉。
channel.basicconsume(
queue_name, false, delivercallback, consumertag -> {}
);// 第二個引數false,表示自動ack關閉
如果rabbitmq發現某條訊息傳送給消費者後,遲遲沒有收到ack,那麼rabbitmq會將該訊息傳送給其它的消費者例項進行消費。
扎心!線上服務宕機時,如何保證資料100%不丟失?
訊息中介軟體集群崩潰,如何保證百萬生產資料不丟失?
如何確保訊息不丟失?
訊息持久化,當然前提是佇列必須持久化 rabbitmq 確保永續性訊息能從伺服器重啟中恢復的方式是,將它們寫入磁碟上 的乙個持久化日誌檔案,當發布一條永續性訊息到持久交換器上時,rabbit 會在 訊息提交到日誌檔案後才傳送響應。一旦消費者從持久佇列中消費了一條持久化訊息,rabbitmq 會在持久...
如何保證訊息中介軟體全鏈路資料100 不丟失(1)
這個問題,在網際網路公司面試的時候高頻出現,而且也是非常現實的生產環境問題。如果你的簡歷中寫了自己熟悉mq技術 rabbitmq rocketmq kafka 而且在專案裡有使用的經驗,那麼非常實際的乙個生產環境問題就是 投遞訊息到mq,然後從mq消費訊息來處理的這個過程,資料到底會不會丟失。面試官...
訊息中介軟體 訊息丟失怎麼辦
如何保證訊息的可靠性傳輸?或者說,如何處理訊息丟失的問題?如果說你這個是用 mq 來傳遞非常核心的訊息,比如說計費 扣費的一些訊息,那必須確保這個 mq 傳遞過程中絕對不會把計費訊息給弄丟。訊息中介軟體各種面試題 訊息中介軟體面試題 訊息丟失怎麼辦?訊息中介軟體面試題 訊息佇列的優缺點,區別 訊息中...