使用消息隊列,繞不開的一個問題就是如何保證消息不丟失,現在主流的消息中間件都提供了完整的消息可靠性保證機制,可以確保消息的可靠傳遞,本文以rocketMq為例介紹如何保證消息不丟失,其他消息隊列類似。原文地址
消息傳遞過程
基本上所有的消息都划分為三個階段生產、存儲、消費,如下圖

- 生產階段: 在這個階段,從消息在 Producer 創建出來,經過網絡傳輸發送到 Broker 端。
- 存儲階段: 在這個階段,消息在 Broker 端存儲,如果是集群,消息會在這個階段被復制到其他的副本上。
- 消費階段: 在這個階段,Consumer 從 Broker 上拉取消息,經過網絡傳輸發送到 Consumer 上。
生產階段
生產階段一般是通過confirm機制,producer把消息發送給broker,broker收到消息后會給客戶端響應回執,producer收到回執則完成一次完整的消息發送。producer如果沒有收到響應回執則會重發。
存儲階段
如果Broker是單點的,可以通過參數設置,當消息持久化后再給響應回執,如果是 Broker 是由多個節點組成的集群,需要將 Broker 集群配置成:至少將消息發送到 2 個以上的節點,再給客戶端回復發送確認響應。這樣當某個 Broker 宕機時,其他的 Broker 可以替代宕機的 Broker,也不會發生消息丟失
消費階段
消費階段和生產階段類似,都是通過confirm機制保障消息不丟失的,客戶端從 Broker 拉取消息后,執行用戶的消費業務邏輯,成功后,才會給 Broker 發送消費確認響應。如果 Broker 沒有收到消費確認響應,下次拉消息的時候還會返回同一條消息,確保消息不會在網絡傳輸過程中丟失,也不會因為客戶端在執行消費邏輯中出錯導致丟失。
