從紅包場(chǎng)景談事務(wù)一致性

今天繼續(xù)談一下業(yè)務(wù)層改造相關(guān)的一個(gè)場(chǎng)景:領(lǐng)取紅包朦蕴。紅包,是這幾年最火的一類營(yíng)銷手段刊愚,從當(dāng)年微信紅包走紅后踊跟,無論是電商還是互金,都開始加入了“紅包”百拓。紅包場(chǎng)景本身并不復(fù)雜琴锭,但由于涉及到了資金的轉(zhuǎn)移晰甚,就會(huì)引入事務(wù)一致性的問題,而且從我了解到的情況看决帖,很多同學(xué)在處理這塊業(yè)務(wù)的時(shí)候厕九,剛開始都一不小心犯了錯(cuò),這也是為什么我要選“紅包”場(chǎng)景來展開談的原因地回。

為了盡可能簡(jiǎn)化問題扁远,以“小明領(lǐng)取現(xiàn)金紅包20元”為例,整個(gè)事務(wù)包含如下操作:

檢查20元紅包是否有效

設(shè)置紅包狀態(tài)為“已領(lǐng)取”

小明賬戶余額加上20元

很明顯刻像,A畅买,B,C3個(gè)操作细睡,要么全部成功谷羞,要么全部失敗。但在這個(gè)場(chǎng)景下溜徙,會(huì)有什么潛在的問題呢湃缎?

一, 1包多領(lǐng)蠢壹,多個(gè)線程同時(shí)發(fā)送領(lǐng)取同一個(gè)紅包的操作嗓违,紅包金額重復(fù)添加。這個(gè)問題常見外部惡意攻擊API图贸,由于缺乏必要的數(shù)據(jù)一致性保護(hù)措施蹂季,讀取臟數(shù)據(jù),導(dǎo)致多領(lǐng)疏日。

二偿洁,丟失更新,領(lǐng)取紅包的同時(shí)沟优,同時(shí)進(jìn)行了購(gòu)買操作父能,線程1的事務(wù)覆蓋線程2事務(wù)已經(jīng)提交的數(shù)據(jù),造成線程2事務(wù)所做操作丟失:

在提出解決方案前净神,我們將后端系統(tǒng)架構(gòu)分為兩類:

單機(jī)版 Standalone,數(shù)據(jù)庫相同溉委,所有的業(yè)務(wù)操作在一個(gè)容器下鹃唯。

微服務(wù) 紅包操作,個(gè)人賬戶操作不在同一個(gè)容器內(nèi)進(jìn)行瓣喊,分屬不同的服務(wù)坡慌,擁有各自的數(shù)據(jù)庫。

單機(jī)版的解決方案

如下圖所示藻三,在應(yīng)用代碼中洪橘,對(duì)紅包與賬戶余額都上鎖跪者,確保紅包對(duì)象同時(shí)只會(huì)被一個(gè)線程所操作。對(duì)紅包加鎖熄求,如果有多余線程想操作紅包渣玲,一定需要等待線程1被執(zhí)行結(jié)束,這個(gè)時(shí)候紅包的狀態(tài)已經(jīng)被更新到數(shù)據(jù)庫中弟晚,根本上杜絕一包多領(lǐng)的情況忘衍。對(duì)賬戶余額加鎖,如果余額賬戶在扣款的時(shí)候卿城,確保領(lǐng)取紅包的操作枚钓,不會(huì)讀取臟數(shù)據(jù),造成更新丟失瑟押。

微服務(wù)下的解決方案

微服務(wù)的解決方案引入了消息隊(duì)列來進(jìn)行處理搀捷。如果紅包狀態(tài)正常,并成功將狀態(tài)至為“已領(lǐng)取”多望,且消息已經(jīng)發(fā)送成功嫩舟,用戶服務(wù)端開始消費(fèi)這條消息,如果這個(gè)時(shí)候出現(xiàn)消費(fèi)失敗或者消費(fèi)超時(shí)便斥,利用消息隊(duì)列進(jìn)行重試至壤,直到用戶端執(zhí)行成功,考慮到“一包多領(lǐng)”的問題枢纠,整個(gè)過程中有可能會(huì)出現(xiàn)消息重復(fù)的問題像街。所以我們?cè)谖⒎?wù)中,需要做到以下兩點(diǎn):

1. 消費(fèi)端處理消息的業(yè)務(wù)邏輯保持冪等性晋渺。

2. 保證每條消息都有唯一編號(hào)且保證消息處理成功與去重表的日志同時(shí)出現(xiàn)镰绎。

在使用MQ過程中,需要注意以下幾點(diǎn):

一個(gè)應(yīng)用盡可能用一個(gè) Topic木西,消息子類型用 tags 來標(biāo)識(shí)畴栖。只有發(fā)送消息設(shè)置了tags,消費(fèi)方在訂閱消息時(shí)八千,才可以利用 tags 在 broker 做消息過濾吗讶。

每個(gè)消息在業(yè)務(wù)層面的唯一標(biāo)識(shí)碼,要設(shè)置到 keys 字段恋捆,方便將來定位消息丟失問題照皆。

消息發(fā)送成功或者失敗,要打印消息日志沸停,務(wù)必要打印 sendresult 和 key 字段膜毁。

對(duì)于消息不可丟失應(yīng)用,務(wù)必要有消息重發(fā)機(jī)制。

總結(jié)

在OLTP系統(tǒng)領(lǐng)域瘟滨,我們?cè)诤芏鄻I(yè)務(wù)場(chǎng)景下都會(huì)面臨事務(wù)一致性方面的需求,一個(gè)看起來簡(jiǎn)單的功能候醒,內(nèi)部可能需要調(diào)用多個(gè)“服務(wù)”并操作多個(gè)數(shù)據(jù)庫來實(shí)現(xiàn),特別是高并發(fā)的情況下杂瘸,更是考驗(yàn)我們架構(gòu)中細(xì)節(jié)處理的時(shí)候倒淫。這里,沒有一個(gè)標(biāo)準(zhǔn)的萬能答案胧沫,不過只要我們能遵循基本的設(shè)計(jì)原則昌简,都可以在場(chǎng)景下找到解決方案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绒怨,一起剝皮案震驚了整個(gè)濱河市纯赎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌南蹂,老刑警劉巖犬金,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異六剥,居然都是意外死亡晚顷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門疗疟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來该默,“玉大人,你說我怎么就攤上這事策彤∷ㄐ洌” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵店诗,是天一觀的道長(zhǎng)裹刮。 經(jīng)常有香客問我,道長(zhǎng)庞瘸,這世上最難降的妖魔是什么捧弃? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮擦囊,結(jié)果婚禮上违霞,老公的妹妹穿的比我還像新娘。我一直安慰自己瞬场,他們只是感情好葛家,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泌类,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刃榨,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天弹砚,我揣著相機(jī)與錄音,去河邊找鬼枢希。 笑死桌吃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苞轿。 我是一名探鬼主播茅诱,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼搬卒!你這毒婦竟也來了瑟俭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤契邀,失蹤者是張志新(化名)和其女友劉穎摆寄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯门,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡微饥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了古戴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欠橘。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖现恼,靈堂內(nèi)的尸體忽然破棺而出肃续,到底是詐尸還是另有隱情,我是刑警寧澤述暂,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布痹升,位于F島的核電站,受9級(jí)特大地震影響畦韭,放射性物質(zhì)發(fā)生泄漏疼蛾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一艺配、第九天 我趴在偏房一處隱蔽的房頂上張望察郁。 院中可真熱鬧,春花似錦转唉、人聲如沸皮钠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽麦轰。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間款侵,已是汗流浹背末荐。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留新锈,地道東北人甲脏。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妹笆,于是被迫代替她去往敵國(guó)和親块请。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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