一句柠、緣起
MQ消息必達浦译,架構(gòu)上有兩個核心設(shè)計點:
(1)消息落地
(2)消息超時、重傳溯职、確認
再次回顧消息總線核心架構(gòu)精盅,它由
發(fā)送端、服務(wù)端谜酒、固化存儲渤弛、接收端
四大部分組成。
為保證消息的可達性甚带,超時她肯、重傳、確認機制可能導(dǎo)致消息總線鹰贵、或者業(yè)務(wù)方收到重復(fù)的消息晴氨,從而對業(yè)務(wù)產(chǎn)生影響。
舉個栗子:
購買會員卡碉输,上游支付系統(tǒng)負責給用戶扣款籽前,下游系統(tǒng)負責給用戶發(fā)卡,通過MQ異步通知敷钾。不管是上半場的ACK丟失枝哄,導(dǎo)致MQ收到重復(fù)的消息,還是下半場ACK丟失阻荒,導(dǎo)致購卡系統(tǒng)收到重復(fù)的購卡通知挠锥,都可能出現(xiàn),上游扣了一次錢侨赡,下游發(fā)了多張卡蓖租。
消息總線的冪等性設(shè)計至關(guān)重要粱侣,是本文將要討論的重點。
二蓖宦、上半場的冪等性設(shè)計
MQ消息發(fā)送上半場齐婴,即上圖中的1-3
1,發(fā)送端MQ-client將消息發(fā)給服務(wù)端MQ-server
2稠茂,服務(wù)端MQ-server將消息落地
3柠偶,服務(wù)端MQ-server回ACK給發(fā)送端MQ-client
如果3丟失,發(fā)送端MQ-client超時后會重發(fā)消息睬关,可能導(dǎo)致服務(wù)端MQ-server收到重復(fù)消息诱担。
此時重發(fā)是MQ-client發(fā)起的,消息的處理是MQ-server共螺,為了避免步驟2落地重復(fù)的消息该肴,對每條消息,MQ系統(tǒng)內(nèi)部必須生成一個inner-msg-id藐不,作為去重和冪等的依據(jù)匀哄,這個內(nèi)部消息ID的特性是:
(1)全局唯一
(2)MQ生成,具備業(yè)務(wù)無關(guān)性雏蛮,對消息發(fā)送方和消息接收方屏蔽
有了這個inner-msg-id涎嚼,就能保證上半場重發(fā),也只有1條消息落到MQ-server的DB中挑秉,實現(xiàn)上半場冪等法梯。
三、下半場的冪等性設(shè)計
MQ消息發(fā)送下半場犀概,即上圖中的4-6
4立哑,服務(wù)端MQ-server將消息發(fā)給接收端MQ-client
5,接收端MQ-client回ACK給服務(wù)端
6姻灶,服務(wù)端MQ-server將落地消息刪除
需要強調(diào)的是铛绰,接收端MQ-client回ACK給服務(wù)端MQ-server,是消息消費業(yè)務(wù)方的主動調(diào)用行為产喉,不能由MQ-client自動發(fā)起捂掰,因為MQ系統(tǒng)不知道消費方什么時候真正消費成功。
如果5丟失曾沈,服務(wù)端MQ-server超時后會重發(fā)消息这嚣,可能導(dǎo)致MQ-client收到重復(fù)的消息。
此時重發(fā)是MQ-server發(fā)起的塞俱,消息的處理是消息消費業(yè)務(wù)方姐帚,消息重發(fā)勢必導(dǎo)致業(yè)務(wù)方重復(fù)消費(上例中的一次付款,重復(fù)發(fā)卡)敛腌,為了保證業(yè)務(wù)冪等性卧土,業(yè)務(wù)消息體中惫皱,必須有一個biz-id像樊,作為去重和冪等的依據(jù)尤莺,這個業(yè)務(wù)ID的特性是:
(1)對于同一個業(yè)務(wù)場景,全局唯一
(2)由業(yè)務(wù)消息發(fā)送方生成生棍,業(yè)務(wù)相關(guān)颤霎,對MQ透明
(3)由業(yè)務(wù)消息消費方負責判重,以保證冪等
最常見的業(yè)務(wù)ID有:支付ID涂滴,訂單ID友酱,帖子ID等。
具體到支付購卡場景柔纵,發(fā)送方必須將支付ID放到消息體中缔杉,消費方必須對同一個支付ID進行判重,保證購卡的冪等搁料。
有了這個業(yè)務(wù)ID或详,才能夠保證下半場消息消費業(yè)務(wù)方即使收到重復(fù)消息,也只有1條消息被消費郭计,保證了冪等霸琴。
三、總結(jié)
MQ為了保證消息必達昭伸,消息上下半場均可能發(fā)送重復(fù)消息梧乘,如何保證消息的冪等性呢?
上半場
MQ-client生成inner-msg-id庐杨,保證上半場冪等选调。
這個ID全局唯一,業(yè)務(wù)無關(guān)灵份,由MQ保證仁堪。
下半場
業(yè)務(wù)發(fā)送方帶入biz-id,業(yè)務(wù)接收方去重保證冪等各吨。
這個ID對單業(yè)務(wù)唯一枝笨,業(yè)務(wù)相關(guān),對MQ透明揭蜒。
結(jié)論:冪等性横浑,不僅對MQ有要求,對業(yè)務(wù)上下游也有要求屉更。