消息如何保證100%的投遞成功?
什麼是生產端的可靠性投遞?
- 保障消息的成功發出;
- 保障MQ節點的成功接收;
- 發送端收到MQ節點(Broker)確認應答;
- 完善消息補償機制;
生產端可靠性投遞常見解決方案
- 消息落庫,對消息狀態進行打標;
將消息存入數據庫,記錄消息的狀態。可以通過輪詢不斷獲取消息的狀態,從而保證消息的成功投遞。如下圖示所示,這樣做有一個很嚴重的問題就是要多次操作數據庫,對於一些高併發、對性能要求較高的業務,這種方式是不太合適的。因爲頻繁操作數據庫會帶來嚴重的性能問題。
- 消息的延遲投遞,做二次確認,回調檢查;
生產端會發送兩次消息:
第一次:生產端首先會將業務數據存入DB,之後會向MQ發送一個消息,消費端收到消息後發送確認消息(這裏的確認消息不是指ack,而是重新編輯發送一條新消息),回調服務監聽到確認消息後將消息存入DB;
第二次:在第一條消息發送出去後一段時間,生產端會再發送一條check消息,回調服務監聽到check消息後會檢查第一條消息的執行情況,如果消息未能按照預期結果執行的話,回調服務會給生產端發送一條指令讓生產端重新發送消息;
如下圖所示,這種方法可以有效的避免對數據庫的頻繁操作,從而提高性能;同時業務DB和消息DB之間解耦;