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

- 生產階段: 在這個階段,從訊息在 Producer 創建出來,經過網路傳輸發送到 Broker 端,
- 存盤階段: 在這個階段,訊息在 Broker 端存盤,如果是集群,訊息會在這個階段被復制到其他的副本上,
- 消費階段: 在這個階段,Consumer 從 Broker 上拉取訊息,經過網路傳輸發送到 Consumer 上,
生產階段
生產階段一般是通過confirm機制,producer把訊息發送給broker,broker收到訊息后會給客戶端回應回執,producer收到回執則完成一次完整的訊息發送,producer如果沒有收到回應回執則會重發,
存盤階段
如果Broker是單點的,可以通過引數設定,當訊息持久化后再給回應回執,如果是 Broker 是由多個節點組成的集群,需要將 Broker 集群配置成:至少將訊息發送到 2 個以上的節點,再給客戶端回復發送確認回應,這樣當某個 Broker 宕機時,其他的 Broker 可以替代宕機的 Broker,也不會發生訊息丟失
消費階段
消費階段和生產階段類似,都是通過confirm機制保障訊息不丟失的,客戶端從 Broker 拉取訊息后,執行用戶的消費業務邏輯,成功后,才會給 Broker 發送消費確認回應,如果 Broker 沒有收到消費確認回應,下次拉訊息的時候還會回傳同一條訊息,確保訊息不會在網路傳輸程序中丟失,也不會因為客戶端在執行消費邏輯中出錯導致丟失,
reference
《訊息佇列高手》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/17429.html
標籤:Java
