mq上游發(fā)消息失敗,或者沒有發(fā)消息,下游怎么感知到?

?針對(duì)MQ消息隊(duì)列中上游可能發(fā)送失敗或未發(fā)送消息的情況,下游可通過以下方案感知并確保消息可靠性:
??方案設(shè)計(jì):基于「事務(wù)消息 + 異步對(duì)賬 + 主動(dòng)探測」的綜合機(jī)制
?? 1. 事務(wù)消息機(jī)制(確保消息發(fā)送與業(yè)務(wù)一致性)
??? 原理:
?? ? ?使用MQ的事務(wù)消息功能(如RocketMQ的事務(wù)消息),將消息發(fā)送與業(yè)務(wù)操作綁定,確保兩者同時(shí)成功或回滾。
?? ?步驟:
?? ? ?a. 生產(chǎn)者發(fā)送半消息到MQ(消息暫存,不可被消費(fèi))。
?? ? ?b. MQ確認(rèn)半消息接收后,生產(chǎn)者執(zhí)行本地業(yè)務(wù)邏輯。
?? ? ?c. 業(yè)務(wù)成功:生產(chǎn)者提交事務(wù),MQ將消息投遞到隊(duì)列;業(yè)務(wù)失?。荷a(chǎn)者回滾事務(wù),MQ丟棄消息。
?? ?優(yōu)點(diǎn):
?? ? ?避免業(yè)務(wù)成功但消息未發(fā)送,或消息發(fā)送但業(yè)務(wù)失敗的情況。
?? 2. 生產(chǎn)者確認(rèn)與重試(確保消息到達(dá)MQ)
??? 原理:
?? ? ?通過MQ的ACK機(jī)制(如RabbitMQ的Publisher Confirms、Kafka的ACK配置)確認(rèn)消息是否成功寫入。
??? 步驟:
?? ? ?a. 生產(chǎn)者發(fā)送消息后,等待MQ的ACK確認(rèn)。
?? ? ?b. 未收到ACK時(shí),啟用重試機(jī)制(指數(shù)退避重試,避免雪崩)。
?? ? ?c. 重試超過閾值后,記錄異常并觸發(fā)告警。
??? 優(yōu)點(diǎn):
?? ? ?解決網(wǎng)絡(luò)抖動(dòng)、MQ短暫不可用等問題,確保消息到達(dá)MQ。
?? 3. 異步對(duì)賬系統(tǒng)(檢測消息丟失與狀態(tài)一致性)
??? 原理:
?? ? ?通過上下游狀態(tài)記錄與定時(shí)對(duì)賬,發(fā)現(xiàn)未發(fā)送或未消費(fèi)的消息。
??? 步驟:
?? ? ?a. 生產(chǎn)者側(cè):
?? ???業(yè)務(wù)操作完成后,記錄一條"待發(fā)送消息"到數(shù)據(jù)庫(含業(yè)務(wù)ID、狀態(tài)、時(shí)間等)。
?? ???消息成功發(fā)送后,更新狀態(tài)為"已發(fā)送"。
?? ??b. 消費(fèi)者側(cè):
?? ???消費(fèi)成功后,記錄"已處理消息"到數(shù)據(jù)庫。
?? ??c. 對(duì)賬服務(wù):
?? ???定時(shí)掃描生產(chǎn)者庫中的"待發(fā)送消息"與消費(fèi)者庫中的"已處理消息"。
?? ???發(fā)現(xiàn)生產(chǎn)者標(biāo)記為"已發(fā)送"但消費(fèi)者無記錄的,觸發(fā)補(bǔ)償(如重發(fā)消息)。
?? ???發(fā)現(xiàn)生產(chǎn)者標(biāo)記為"待發(fā)送"但長期未更新的,觸發(fā)告警(可能上游未發(fā)送)。
?? ??優(yōu)點(diǎn):
?? ???覆蓋所有異常場景(如消息未發(fā)送、MQ丟失消息、消費(fèi)失敗),確保最終一致性。
?? 4. 主動(dòng)探測與超時(shí)告警(實(shí)時(shí)性補(bǔ)充)
?? ?原理:
?? ??針對(duì)關(guān)鍵業(yè)務(wù)消息,下游設(shè)置超時(shí)閾值,主動(dòng)探測缺失消息。
?? ?步驟:
?? ??a. 生產(chǎn)者發(fā)送消息時(shí),攜帶業(yè)務(wù)時(shí)間戳或唯一ID。
?? ??b. 下游監(jiān)聽消息時(shí),記錄接收時(shí)間。
?? ??c. 若在預(yù)期時(shí)間內(nèi)未收到消息(如訂單支付后10分鐘無物流消息),觸發(fā)主動(dòng)查詢:
?? ???調(diào)用生產(chǎn)者API查詢業(yè)務(wù)狀態(tài)。
?? ???確認(rèn)業(yè)務(wù)是否成功,決定是否補(bǔ)發(fā)消息。
?? ?優(yōu)點(diǎn):
?? ??結(jié)合業(yè)務(wù)邏輯,實(shí)時(shí)性高,避免對(duì)賬延遲。

?實(shí)施建議
??1. 核心業(yè)務(wù):優(yōu)先使用事務(wù)消息 + 異步對(duì)賬,確保高可靠性。
??2. 普通業(yè)務(wù):采用生產(chǎn)者確認(rèn)重試 + 異步對(duì)賬,平衡性能與可靠性。
??3. 補(bǔ)償策略:消費(fèi)者需實(shí)現(xiàn)冪等性,避免重復(fù)消費(fèi)問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容