【轉(zhuǎn)】交易系統(tǒng)在分布式環(huán)境下的問題探討

前幾天跟朋友聊到這個話題导盅,當時沒有想到分布式鎖,后在google上查詢揍瑟,發(fā)現(xiàn)這篇文章邏輯比較清楚——交易系統(tǒng)在分布式環(huán)境下的探討

眾所周知在互聯(lián)網(wǎng)公司白翻,如果你沒有對你的系統(tǒng)進行分庫分表,那你怎么好意思跟人打招呼月培?但是分庫分表帶來的難題也是眾所周知的嘁字,除了多機查詢(分批查詢、合并結(jié)果等等)等問題杉畜,最重要的就是保障事務問題纪蜒,這一點在交易系統(tǒng)中尤為重要。

最為簡單的解決方式就是使用分布式事務此叠,業(yè)界已經(jīng)有了規(guī)范–XA纯续,他使用兩階段提交來保證分布式下的事務,具體的規(guī)范我就不說了灭袁,可以到維基百科上詳細了解猬错,看似完美,但是這個解決方案在分庫分表的環(huán)境下有些“重”茸歧。我們完全可以退一步來想倦炒,我們既然不能保證強一致性,那么我們保證最終一致性也可以達到理想的結(jié)果软瞎。我們主要依托如下兩個理論來構(gòu)建一個最終一致性的系統(tǒng):CAP理論逢唤、BASE模型拉讯。

讓我們舉個栗子來說明:假如一個用戶在亞馬遜上買了一本書,用戶需要做的就是點擊生成訂單鳖藕,而后付款最后等待收貨魔慷,此時從技術的角度來看,我們大致有四個系統(tǒng):用戶系統(tǒng)著恩,賬戶系統(tǒng)院尔,訂單系統(tǒng),物流系統(tǒng)喉誊,而訂單的狀態(tài)變化大致如下:初始–已支付–已發(fā)貨–完成邀摆。正常情況下訂單狀態(tài)會依次變更,而后亞馬遜收到錢款后組織發(fā)貨裹驰。但是在現(xiàn)實中就沒有那么幸福了隧熙,用戶付款后亞馬遜沒收到錢,收到錢后沒有告知用戶發(fā)貨幻林。因為這四個系統(tǒng)所使用的DB、JVM甚至機房都不一樣音念。對于用戶系統(tǒng)沪饺,習慣上對于整個交易系統(tǒng)來講它是用戶展示結(jié)果的所有我們暫時不去討論,那么對于賬戶系統(tǒng)闷愤,不管用戶使用賬戶余額支付還是使用網(wǎng)絡支付整葡,最終的結(jié)構(gòu)都是用戶的余額減少而商家的余額增加。

那么對于這個局部的交易過程(用戶余額減少–商家余額增加)讥脐,我們同樣不敢肯定其是否同處一個DB遭居,所以我們使用分布式鎖保證同一時間對該資源(賬戶余額)的其他操作是不可用的(比如同一時刻對該余額做減少操作)。這樣我們保證了用戶余額減少–商家余額增加這一過程結(jié)果的可控性旬渠,在分布式這方面俱萍,memcache和Redis等都可實現(xiàn)分布式鎖。

下面我們討論當用戶的支付過程完成之后的事情告丢,順利的情況下訂單系統(tǒng)拿到支付成功的結(jié)果后將訂單狀態(tài)更新為支付成功枪蘑。可是假如在這個過程岖免,因為超時抑或其他原因岳颇,導致用戶支付成功,而訂單狀態(tài)已然是未支付該怎么辦颅湘?這時候我們有兩種選擇:輪訓查詢幾次支付結(jié)果而后更新訂單狀態(tài)话侧,此為同步過程。引入消息中間件闯参,將此過程解耦成異步過程瞻鹏。顯然我們應該使用異步方式更優(yōu)雅悲立,并且解耦之后的擴展性更強。那么如何實現(xiàn)呢乙漓,我簡單說下:支付成功之后賬戶系統(tǒng)發(fā)送消息到MQ级历,訂單系統(tǒng)輪詢MQ獲取最新消息,根據(jù)消息更新訂單狀態(tài)叭披。這樣的結(jié)果就是用戶系統(tǒng)首先依然認為訂單未支付并展示給用戶寥殖,而后臺處理完后可以等待用戶主動獲取訂單狀態(tài)(刷新頁面,京東上就是如此)涩蜘,也可以更高端的主動推送信息給用戶嚼贡。那么物流狀態(tài)依然引入MQ來完成異步化的操作。

看似我們的這個過程已經(jīng)“優(yōu)雅”的完成了同诫,用戶看到了支付狀態(tài)又看到了發(fā)貨提醒粤策,安心的等待中。

后記:還需繼續(xù)思考的點

  • 分布式鎖的競態(tài)處理误窖;
  • 消息發(fā)送的一致性(100%保證消息送達)
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叮盘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霹俺,更是在濱河造成了極大的恐慌柔吼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丙唧,死亡現(xiàn)場離奇詭異愈魏,居然都是意外死亡,警方通過查閱死者的電腦和手機想际,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門培漏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胡本,你說我怎么就攤上這事牌柄。” “怎么了打瘪?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵友鼻,是天一觀的道長。 經(jīng)常有香客問我闺骚,道長彩扔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任僻爽,我火速辦了婚禮虫碉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胸梆。我一直安慰自己敦捧,他們只是感情好须板,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兢卵,像睡著了一般习瑰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秽荤,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天甜奄,我揣著相機與錄音,去河邊找鬼窃款。 笑死课兄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的晨继。 我是一名探鬼主播烟阐,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼紊扬!你這毒婦竟也來了蜒茄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤餐屎,失蹤者是張志新(化名)和其女友劉穎扩淀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啤挎,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年卵凑,在試婚紗的時候發(fā)現(xiàn)自己被綠了庆聘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡勺卢,死狀恐怖伙判,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黑忱,我是刑警寧澤宴抚,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站甫煞,受9級特大地震影響菇曲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抚吠,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一常潮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧楷力,春花似錦喊式、人聲如沸孵户。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夏哭。三九已至,卻和暖如春献联,著一層夾襖步出監(jiān)牢的瞬間竖配,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工酱固, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留械念,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓运悲,卻偏偏與公主長得像龄减,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子班眯,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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