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

  • 2021 年 11 月 22 日
  • 筆記

消息丟失分成三種情況,可能出現生產者、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 確認

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

Tags: