RqbbitMq | 消息持久化處理以及消息確認ACK機制

autoDelete 屬性 保持消息持久化

@Queue: 當所有消費客戶端連接斷開後,是否自動刪除
隊列 true:刪除 false:不刪除

@Exchange:當所有綁定隊列都不在使用時,是否自動
刪除交換器 true:刪除 false:不刪除

什麼是消息確認ACK?

如果在處理消息的過程中,消費者的服務器在處理消息時出現異常,那可能這條正
在處理的消息就沒有完成消息消費,數據就會丟失。爲了確保數據不會丟失,
Rabbi tMQ支持消息確認-ACK.

ACK機制是消費者從Rabbi tMQ收到消息並處理完成後,反饋給Rabbi tMQ,
Rabbi tMQ收到反饋後纔將此消息從隊列中刪除。
1.如果一個消費者在處理消息出現了網絡不穩定、服務器異常等現象,那麼就不會
有ACK反饋,RabbitMQ會認爲這個消息沒有正常消費,會將消息重新放入隊列中。
2.如果在集羣的情況下: Rabbi tMQ會立即將這個消息推送給這個在線的其他消費
者。這種機制保證了在消費者服務端故障的時候,不丟失任何消息和任務。
3.消息永遠不會從Rabbi tMQ中刪除:只有當消費者正確發送ACK反饋,Rabbi tMQ
確認收到後,消息纔會從RabbitMQ服務器的數據中刪除。
4.消息的ACK確認機制默認是打開的。

開啓自動應答:
不在乎消費者是否處理消息成功,都會告訴對列刪除此消息,如果處理消息失敗會進行自動補償

ACK機制的開發注意事項
如果忘記了ACK,那麼後果很嚴重。當Consumer退出時,Message會一直重新分發
然後Rabbi tMQ會佔用越來越多的內存,由於Rabbi tMQ會長時間運行,因此這個‘
內存泄漏”是致命的

解決方式

#開啓重試
springrabbitmq.listener.retry.enabled=true
#重試次數,默認爲 3 次
spring.rabbitmq.listener.retry.max-attempts=5

開啓自手動應答:

channel.basicAck(envelope.getDeliveryTag(), false);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章