消息丟失分成三種情況,可能出現生產者、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 確認
如果覺得文章對你有幫助的話,請點個推薦吧!!!