一丶簡介
RabbitMQ消息確認ACK機制
1、什么是消息確認ACK。
答:如果在處理消息的過程中,消費者的服務器在處理消息的時候出現異常,那么可能這條正在處理的消息就沒有完成消息消費,數據就會丟失。為了確保數據不會丟失,RabbitMQ支持消息確定-ACK。
2、ACK的消息確認機制。
答:ACK機制是消費者從RabbitMQ收到消息並處理完成后,反饋給RabbitMQ,RabbitMQ收到反饋后才將此消息從隊列中刪除。
如果一個消費者在處理消息出現了網絡不穩定、服務器異常等現象,那么就不會有ACK反饋,RabbitMQ會認為這個消息沒有正常消費,會將消息重新放入隊列中。
如果在集群的情況下,RabbitMQ會立即將這個消息推送給這個在線的其他消費者。這種機制保證了在消費者服務端故障的時候,不丟失任何消息和任務。
消息永遠不會從RabbitMQ中刪除,只有當消費者正確發送ACK反饋,RabbitMQ確認收到后,消息才會從RabbitMQ服務器的數據中刪除。
消息的ACK確認機制默認是打開的。
3、ACK機制的開發注意事項。
答:如果忘記了ACK,那么后果很嚴重。當Consumer退出時候,Message會一直重新分發。然后RabbitMQ會占用越來越多的內容,由於RabbitMQ會長時間運行,因此這個"內存泄漏"是致命的。
那么如何防止內存泄漏發生呢?
直接上代碼。
#開啟重試 spring.rabbitmq.listener.direct.retry.enabled=true #設置重試次數,默認為三次 spring.rabbitmq.listener.direct.retry.max-attempts=5
只需要在配置文件中加上如上配置,就可以防止Message一直從新分發而導致內存泄漏。
本來還想加上代碼,不過看到有位大佬寫的很好,就不多此一舉了,奉上鏈接:RabbitMQ的消息確認ACK機制