如何保證消息隊列的可靠性傳輸?


消息丟失分成三種情況,可能出現生產者、RabbitMQ、消費者。

生產者丟失數據

首先要確保寫入 RabbitMQ 的消息別丟,消息隊列通過請求確認機制,保證消息的可靠傳輸。生產開啟 comfirm 模式,在生產者開啟 comfirm 模式之后,每次發送消息都會分配一個唯一的id。

  • 如果寫入了 RabbitMQ 中,RabbitMQ 會回傳一個 ack 消息
  • 如果沒能寫入 RabbitMQ,會回調一個 nack 接口, 可以重新發送消息

一般在生產者這塊避免數據丟失,都是用 confirm 機制的

RabbitMQ丟失數據

RabbitMQ 丟失數據,需要開啟 RabbitMQ 持久化,開啟持久化之后,生產者發送的消息會持久化到磁盤,RabbitMQ 就算是掛了,恢復啟動后也會讀取之前存儲的數據。
還有一種少見的情況,就是RabbitMQ還沒將消息持久化,自己就掛了。這種情況需要生產者那邊的確認機制結合起來。只有消息被持久化到磁盤以后,才會回傳 ack 消息。生產者沒有接收到 ack,也可以自己重發。

消費者丟失數據

消費丟失數據,剛消費到 RabbitMQ 發送的數據,消費進程就掛了,重啟進程后,RabbitMQ 也不會重新發送消息。
這個時候需要關閉 RabbitMQ 關閉自動的 ack 機制。每次在消費端處理后,再在程序里做 ack 確認,這樣的話,如果沒有處理完,就沒有 ack 確認,那 RabbitMQ 就認為你還沒有處理完,這個時候 RabbitMQ 會重新發送消息給消費者。

總結

  • 生產者
    • 開啟確認 comfirm 機制
  • MQ
    • 開啟 RabbitMQ 持久化
  • 消費者
    • 關閉RabbitMQ 自動 ack 確認

如果覺得文章對你有幫助的話,請點個推薦吧!!!


免責聲明!

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



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