MQ之如何做到消息冪等

一句柠、緣起

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ù)上下游也有要求屉更。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徙融,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瑰谜,更是在濱河造成了極大的恐慌欺冀,老刑警劉巖树绩,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異隐轩,居然都是意外死亡饺饭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門职车,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘫俊,“玉大人,你說我怎么就攤上這事悴灵】秆浚” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵积瞒,是天一觀的道長川尖。 經(jīng)常有香客問我,道長茫孔,這世上最難降的妖魔是什么叮喳? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮银酬,結(jié)果婚禮上嘲更,老公的妹妹穿的比我還像新娘。我一直安慰自己揩瞪,他們只是感情好赋朦,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著李破,像睡著了一般宠哄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嗤攻,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天毛嫉,我揣著相機與錄音,去河邊找鬼妇菱。 笑死承粤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的闯团。 我是一名探鬼主播辛臊,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼房交!你這毒婦竟也來了彻舰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刃唤,沒想到半個月后隔心,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡尚胞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年硬霍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辐真。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡须尚,死狀恐怖崖堤,靈堂內(nèi)的尸體忽然破棺而出侍咱,到底是詐尸還是另有隱情,我是刑警寧澤密幔,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布楔脯,位于F島的核電站,受9級特大地震影響胯甩,放射性物質(zhì)發(fā)生泄漏昧廷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一偎箫、第九天 我趴在偏房一處隱蔽的房頂上張望木柬。 院中可真熱鬧,春花似錦淹办、人聲如沸眉枕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽速挑。三九已至,卻和暖如春副硅,著一層夾襖步出監(jiān)牢的瞬間姥宝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工恐疲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腊满,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓培己,卻偏偏與公主長得像碳蛋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子漱凝,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一疮蹦、架構(gòu)方向 MQ要想盡量消息必達,架構(gòu)上有兩個核心設(shè)計點: (1)消息落地 (2)消息超時茸炒、重傳愕乎、確認 二阵苇、MQ...
    duzhongli閱讀 1,796評論 0 20
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)感论,斷路器绅项,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 分布式開放消息系統(tǒng)(RocketMQ)的原理與實踐 來源:http://www.reibang.com/p/453...
    meng_philip123閱讀 12,920評論 6 104
  • “ 消息隊列已經(jīng)逐漸成為企業(yè)IT系統(tǒng)內(nèi)部通信的核心手段。它具有低耦合比肄、可靠投遞快耿、廣播、流量控制芳绩、最終一致性等一系列...
    落羽成霜丶閱讀 3,984評論 1 41
  • 一掀亥、同源策略 要理解跨域,先要了解一下“同源策略”妥色。所謂同源是指搪花,域名,協(xié)議嘹害,端口相同撮竿。所謂“同源策略“,簡單的說...
    臭臭臭魁閱讀 489評論 0 0