首先,在RabbitMQ的整個消息傳遞過程中,有三種情況會存在丟失。
1)生產者把消息發送到RabbitMQ Server的過程中丟失
2)RabbitMQ Server收到消息後在持久化之前宕機導致數據丟失
3)消費端收到消息還沒來得及處理宕機,導致RabbitMQ Server認為這個消息已簽收。
1)從生產者發送消息的角度來説,RabbitMQ提供了一個Confirm(消息確認)機制,
生產者發送消息到Server端以後,如果消息處理成功,Server端會返回一個ack消息。
客户端可以根據消息的處理結果來決定是否要做消息的重新發送,從而確保消息一定到達RabbitMQ Server上。
2)從RabbitMQ Server端來説,可以開啓消息的持久化機制,也就是收到消息之後持久化到磁盤裏面。
設置消息的持久化有兩個步驟。
1)創建Queue的時候設置為持久化。
2)發送消息的時候,把消息投遞模式設置為持久化投遞。
不過雖然設置了持久化消息,但是有可能會出現,消息刷新到磁盤之前,RabbitMQ Server宕機導致消息丟失的問題。
所以為了確保萬無一失,需要結合Confirm消息確認機制一起使用。
3)從消費端的角度來説,我們可以把消息的自動確認機制修改成手動確認,也就是説消費端只有手動調用,消息確認方法才表示消息已經被簽收。