1.名詞解釋:
分布式系統(tǒng):部署在不同結點上的系統(tǒng)通過網(wǎng)絡交互來完成協(xié)同工作的系統(tǒng)箕慧。例如充值和積分系統(tǒng)
事務:事務是指由一組操作組成的一個工作單元,這個工作單元具有原子性(atomicity)汛兜、一致性(consistency)、隔離性(isolation)和持久性(durability)通今。
本地事務:本地事務就是用關系數(shù)據(jù)庫來控制事務粥谬,關系數(shù)據(jù)庫通常都具有ACID特性肛根,傳統(tǒng)的單體應用通常會將數(shù)據(jù)全部存儲在一個數(shù)據(jù)庫中,會借助關系數(shù)據(jù)庫來完成事務控制漏策。
分布式事務:
表現(xiàn)1:在分布式系統(tǒng)中一次操作由多個系統(tǒng)協(xié)同完成派哲,這種一次事務操作涉及多個系統(tǒng)通過網(wǎng)絡協(xié)同完成的過程稱為分布式事務!這里強調(diào)的是多個系統(tǒng)通過網(wǎng)絡協(xié)同完成一個事務的過程掺喻,并不強調(diào)多個系統(tǒng)訪問了不同的數(shù)據(jù)庫芭届,即使多個系統(tǒng)訪問的是同一個數(shù)據(jù)庫也是分布式事務,如下圖:
表現(xiàn)2:分布式事務的表現(xiàn)是感耙,一個應用程序使用了多個數(shù)據(jù)源連接了不同的數(shù)據(jù)庫褂乍,當一次事務需要操作多個數(shù)據(jù)源,此時也屬于分布式事務即硼,當系統(tǒng)作了數(shù)據(jù)庫拆分后會出現(xiàn)此種情況逃片。
2.分布式事務有哪些場景??
1) 電商系統(tǒng)中的下單扣庫存電商系統(tǒng)中,訂單系統(tǒng)和庫存系統(tǒng)是兩個系統(tǒng)只酥,一次下單的操作由兩個系統(tǒng)協(xié)同完成 2)金融系統(tǒng)中的銀行卡充值褥实,在金融系統(tǒng)中通過銀行卡向平臺充值需要通過銀行系統(tǒng)和金融系統(tǒng)協(xié)同完成。3)教育系統(tǒng)中下單選課業(yè)務在線教育系統(tǒng)中裂允,用戶購買課程损离,下單支付成功后學生選課成功,此事務由訂單系統(tǒng)和選課系統(tǒng)協(xié)同完成绝编。4) SNS系統(tǒng)的消息發(fā)送在社交系統(tǒng)中發(fā)送站內(nèi)消息同時發(fā)送手機短信僻澎,一次消息發(fā)送由站內(nèi)消息系統(tǒng)和手機通信系統(tǒng)協(xié)同完成。
3.解決方案
1)簡述:消息隊列實現(xiàn)最終一致--》將分布式事務拆分成多個本地事務來完成瓮增,并且由消息隊列異步協(xié)調(diào)完成
2)流程:1怎棱、訂單服務和庫存服務完成檢查和預留資源。2绷跑、訂單服務在本地事務中完成添加訂單表記錄和添加“減少庫存任務消息”。3凡资、由定時任務根據(jù)消息表的記錄發(fā)送給MQ通知庫存服務執(zhí)行減庫存操作砸捏。4、庫存服務執(zhí)行減少庫存隙赁,并且記錄執(zhí)行消息狀態(tài)(為避免重復執(zhí)行消息垦藏,在執(zhí)行減庫存之前查詢是否執(zhí)行過此消息)。5伞访、庫存服務向MQ發(fā)送完成減少庫存的消息掂骏。6、訂單服務接收到完成庫存減少的消息后刪除原來添加的“減少庫存任務消息”厚掷。
3)實現(xiàn)最終事務一致要求:預留資源成功理論上要求正式執(zhí)行成功弟灼,如果執(zhí)行失敗會進行重試级解,要求業(yè)務執(zhí)行方法實現(xiàn)冪等。
4)優(yōu)點:由MQ按異步的方式協(xié)調(diào)完成事務田绑,性能較高勤哗。不用實現(xiàn)try/confirm/cancel接口,開發(fā)成本比TCC低掩驱。
5)缺點:此方式基于關系數(shù)據(jù)庫本地事務來實現(xiàn)芒划,會出現(xiàn)頻繁讀寫數(shù)據(jù)庫記錄,浪費數(shù)據(jù)庫資源欧穴,另外對于高并發(fā)操作不是最佳方案民逼。
4.具體實現(xiàn)----中間件解決場景3的問題(手動選課)
1.支付成功后,訂單服務向本地數(shù)據(jù)庫更新訂單狀態(tài)并向消息表寫入“添加選課消息”涮帘,通過本地數(shù)據(jù)庫保證訂單狀態(tài)和添加選課消息的事務缴挖。
2.定時任務掃描消息表,取出“添加選課任務“并發(fā)向MQ焚辅。
3.學習服務接收到添加選課的消息映屋,先查詢本地數(shù)據(jù)庫的歷史消息表是否存在消息,存在則說明已經(jīng)添加選課同蜻,否則向本地數(shù)據(jù)庫添加選課棚点,并向歷史消息表添加選課消息。這里選課表和歷史消息表在同一個數(shù)據(jù)庫湾蔓,通過本地事務保證瘫析。
4.學習服務接收到添加選課的消息,通過查詢消息表判斷如果已經(jīng)添加選課也向MQ發(fā)送“完成添加選課任務的消息”默责,否則則添加選課贬循,完成后向MQ發(fā)送“完成添加選課任務的消息”,
5.訂單服務接收到完成選課的消息后刪除訂單數(shù)據(jù)庫中消息表的“添加選課消息”桃序,為保證后期對賬將消息表的消息先添加到歷史消息表再刪除消息杖虾,表示此消息已經(jīng)完成。
5.注意點:
1)定時任務發(fā)送消息流程如下:1媒熊、每隔1分鐘掃描一次任務表奇适。1、定時任務掃描task表芦鳍,一次取出多個任務嚷往,取出超過1分鐘未處理的任務? 2、考慮訂單服務可能集群部署柠衅,為避免重復發(fā)送任務使用樂觀鎖的方式每次從任務列表取出要處理的任務 3皮仁、任務發(fā)送完畢更新任務發(fā)送時間
2)樂觀鎖取任務:考慮訂單服務將來會集群部署,為了避免任務在1分鐘內(nèi)重復執(zhí)行,這里使用樂觀鎖贷祈,實現(xiàn)思路如下:1) 每次取任務時判斷當前版本及任務id是否匹配趋急,如果匹配則執(zhí)行任務,如果不匹配則取消執(zhí)行付燥。2) 如果當前版本和任務Id可以匹配到任務則更新當前版本加1.