您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何保證RabbitMQ重啟后消息不丟失的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇如何保證RabbitMQ重啟后消息不丟失文章都會有所收獲,下面我們一起來看看吧。
(1)生產者提交給消息服務器時,使用確認機制
channel.confirmSelect(); …………if (channel.waitForConfirms()) { System.out.println("發送消息成功"); } else { System.out.println("發送消息失敗"); }
生產者收不到確認的情況:
1)MQ掛了
2)MQ滿了,
解決辦法:每次的生產者消息發送都通過日志表記錄下來,后續采用手動補償即可
(2)消息服務器對應的隊列、交換機等都持久化,保證數據的不丟失
1)代碼設置
2)控制平臺設置---默認都是持久化的。臨時的話重啟后就會消失
durable是否持久化 durable為持久化、 Transient 不持久化
autoDelete 是否自動刪除,當最后一個消費者斷開連接之后隊列是否自動被刪除,可以通過RabbitMQ Management,查看某個隊列的消費者數量,當consumers = 0時隊列就會自動刪除
如果已經設置了持久化,則給生產者確認的時候就是持久化成功后的確認。這樣就算硬盤壞了、持久化的過程斷電了,都不會影響到消息的丟失,因為生產者收不到確認證明沒發送成功。
(3)消費者采用消息確認機制,保證數據的不丟失
1)消息隊列到消費者的方式有首次主動拉取、后續生產者發送時的主動推送和消費者發生異常時的重試三種方式。
2)消息應答的方式默認為自動,即消費者收到消息時,隊列即刪除。如果消費者出現了斷電等情況,也會被直接刪除。所以要改成手動確認刪除后,隊列才會真正刪除,這樣保證了消息的不丟失。
channel.basicConsume(QUEUE_NAME, false, defaultConsumer); 注:第二個參數值為false代表關閉RabbitMQ的自動應答機制,改為手動應答。 在處理完消息時,返回應答狀態,true表示為自動應答模式。 channel.basicAck(envelope.getDeliveryTag(), false);
(1)默認的情況下mq服務器端創建隊列和交換機都是持久化的
(2)如果是代碼創建的話,將該值設置為durablet
關于“如何保證RabbitMQ重啟后消息不丟失”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“如何保證RabbitMQ重啟后消息不丟失”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。