MQ 如何實(shí)現(xiàn),消息冪等( MQ 真的不能再背鍋了)?
《MQ如何實(shí)現(xiàn),消息必達(dá)?》消息必達(dá),架構(gòu)設(shè)計(jì)上有兩個(gè)核心設(shè)計(jì)點(diǎn):
- 消息落地;
- 消息超時(shí)、重傳、確認(rèn);
但消息重傳可能導(dǎo)致reciever收到重復(fù)的消息,從而對(duì)業(yè)務(wù)產(chǎn)生影響。
MQ如何實(shí)現(xiàn)消息冪等呢?這還是得從MQ的消息發(fā)送流程說(shuō)起。
如《MQ如何實(shí)現(xiàn),消息必達(dá)?》所述,MQ能解除發(fā)布訂閱者之間的耦合,它將消息投遞解耦成上下兩個(gè)半場(chǎng):
- 箭頭1,上半場(chǎng):發(fā)送方將消息投遞給MQ;
- 箭頭2,下半場(chǎng):MQ將消息投遞給接收方;
MQ要想實(shí)現(xiàn)冪等,上下半場(chǎng)都必須做到冪等。
上半場(chǎng),如何做到冪等?
MQ消息投遞上半場(chǎng),流程見(jiàn)上圖123:
- 1:sender將消息發(fā)送給MQ-server;
- 2:MQ-server將消息落地;
- 3:MQ-server回調(diào)sender;
如果步驟3超時(shí),步驟1會(huì)重傳,會(huì)導(dǎo)致步驟2收到重復(fù)的消息。此時(shí),
- 重發(fā)方是:MQ-client
- 接收方是:MQ-server
消息的收發(fā)在MQ系統(tǒng)內(nèi)閉環(huán),可以由MQ來(lái)實(shí)施消息冪等。
MQ如何實(shí)施消息冪等?
為了避免步驟2落地重復(fù)的消息,對(duì)每條消息,MQ系統(tǒng)內(nèi)部必須生成一個(gè)inner-msg-id,作為去重和冪等的依據(jù)。
這個(gè)inner-msg-id的特性是:
- 全局唯一;
- 由MQ生成,具備業(yè)務(wù)無(wú)關(guān)性,對(duì)消息發(fā)送方和消息接收方都透明;
有了這個(gè)inner-msg-id,就能保證上半場(chǎng)重發(fā),也只有1條消息落到MQ-server的DB中,實(shí)現(xiàn)上半場(chǎng)冪等。
下半場(chǎng),如何做到冪等?
MQ消息投遞下半場(chǎng),流程見(jiàn)上圖456:
- 4:MQ-server回調(diào)reciever;
- 5:reciever收到消息,處理業(yè)務(wù)邏輯,將ACK發(fā)送給MQ-server;
- 6:MQ-server收到ACK,將之前已經(jīng)落地的消息刪除,流程結(jié)束;
如果步驟5超時(shí),步驟4會(huì)重傳,會(huì)導(dǎo)致業(yè)務(wù)處理方收到重復(fù)的消息。此時(shí),
- 重發(fā)方是:MQ-server
- 接收方是:業(yè)務(wù)處理方
消息的收發(fā)不能在MQ系統(tǒng)內(nèi)閉環(huán),只能由業(yè)務(wù)處理方來(lái)保證消息冪等。
業(yè)務(wù)處理方如何實(shí)施消息冪等?
在消息實(shí)體中,必須有一個(gè)biz-id,作為去重和冪等的依據(jù),這個(gè)biz-id的特性是:
- 對(duì)于同一個(gè)業(yè)務(wù)場(chǎng)景,全局唯一;
- 由業(yè)務(wù)消息發(fā)送方生成,業(yè)務(wù)相關(guān),對(duì)MQ透明;
- 由業(yè)務(wù)消息接收方負(fù)責(zé)判重,以保證冪等;
最常見(jiàn)的biz-id有:
- 訂單id,業(yè)務(wù)方有義務(wù)避免重復(fù)生成;
- 支付id,業(yè)務(wù)方有義務(wù)避免重復(fù)扣款;
- 帖子id,業(yè)務(wù)方有義務(wù)避免重復(fù)發(fā)布;
- ...
總結(jié)
MQ要想實(shí)現(xiàn)冪等,上下半場(chǎng)都必須做到冪等。
上半場(chǎng):
- MQ-client生成inner-msg-id,保證上半場(chǎng)冪等;
- inner-msg-id全局唯一,業(yè)務(wù)無(wú)關(guān),由MQ保證;
下半場(chǎng):
- 業(yè)務(wù)發(fā)送方帶入biz-id,業(yè)務(wù)接收方去重保證冪等;
- 這個(gè)biz-id對(duì)業(yè)務(wù)唯一,業(yè)務(wù)相關(guān),對(duì)MQ透明。
冪等性,不僅對(duì)MQ有要求,對(duì)業(yè)務(wù)上下游也有要求,那些罵MQ無(wú)法保證冪等的架構(gòu)師,其實(shí)自己...
知其然,知其所以然。
思路比結(jié)論更重要。