為了保證消息不丟失,需要在生產者、RabbitMQ本身和消費者三個環節采取相應措施。
1.生產者端:確保消息發送成功
1.1開啟消息確認機制(Publisher Confirms)
- 原理: 生產者發送消息后,RabbitMQ會返回一個確認(ACK),表示消息已成功接收。
1.2開啟事務機制(Transactions)
- 原理: 生產者發送信息后,可以通過事務機制確保信息被成功接收。
- 注意: 事務機制性能較低,推薦消息確認機制。
1.3消息持久化
- 原理: 將消息標記為持久化,確保RabbitMQ重啟后消息不會丟失。
2.RabbitMQ端:確保消息可靠存儲
2.1隊列持久化:
- 原理: 將隊列標記為持久化,確保RabbitMQ重啟后隊列不會丟失。
2.2交換機持久化:
- 原理: 將交換機標記為持久化,確保RabbitMQ重啟后交換機不會丟失。
2.3鏡像隊列
- 原理: 將隊列鏡像到多個節點,確保即使某個節點宕機,消息也不會丟失。
3.消費者端:確保消息成功處理
3.1手動確認
- 原理: 消費者在處理完消息后,手動發送確認(ACK)給RabbitMQ,表示消息已成功處理。
3.2消息重試機制:
- 原理: 如果消息處理失敗,可以將消息重新放回隊列或轉移到私信隊列(Dead Letter Queue DLQ)。
3.3死信隊列:
- 原理: 將處理失敗的消息轉移到死信隊列,避免消息丟失。
4.總結:
- 生產者端: 開啟消息確認機制,發送持久化消息。
- RabbitMQ端: 持久化隊列和交換機,使用鏡像隊列。
- 消費者端: 開啟手動確認機制,實現消費重試或使用死信隊列。