聊聊分布式事务
分布式事務(wù)場景如何設(shè)計系統(tǒng)架構(gòu)及解決數(shù)據(jù)一致性問題,個人理解最終方案把握以下原則就可以了,那就是:大事務(wù)=小事務(wù)(原子事務(wù))+異步(消息通知),解決分布式事務(wù)的最好辦法其實(shí)就是不考慮分布式事務(wù),將一個大的業(yè)務(wù)進(jìn)行拆分,整個大的業(yè)務(wù)流程,轉(zhuǎn)化成若干個小的業(yè)務(wù)流程,然后通過設(shè)計補(bǔ)償流程從而考慮最終一致性。
什么是事務(wù)
事務(wù)(Transaction)及其ACID屬性
事務(wù)是由一組SQL語句組成的邏輯處理單元,事務(wù)具有以下4個屬性,通常簡稱為事務(wù)的ACID屬性:
典型場景:銀行轉(zhuǎn)賬業(yè)務(wù)
例如:李雷賬戶中有500塊錢,韓梅梅賬戶有200塊錢,李雷要從自己的賬戶中轉(zhuǎn)100塊錢給韓梅梅,轉(zhuǎn)賬(事務(wù))成功執(zhí)行完成后應(yīng)該是李雷賬戶減100變?yōu)?00,韓梅梅賬戶加100變?yōu)?00,不能出現(xiàn)其他情況,即在事務(wù)開始和結(jié)束時數(shù)據(jù)都必須保持一致狀態(tài)(一致性),事務(wù)結(jié)束時所有的數(shù)據(jù)及結(jié)構(gòu)都必須是正確的。并且同樣的轉(zhuǎn)賬操作(同一流水,即一次轉(zhuǎn)賬操作)無論執(zhí)行多少次結(jié)果都相同(冪等性)。
電商場景:流量充值業(yè)務(wù)
再說我們做的一個項(xiàng)目:中國移動-流量充值能力中心,核心業(yè)務(wù)流程為:
此業(yè)務(wù)流程看似不是很復(fù)雜對吧,不涉及到類似電商業(yè)務(wù)的實(shí)物購買,但是我認(rèn)為其中的區(qū)別并不是很大,只是缺少電商中的物流發(fā)貨流程,其他流程幾乎是一樣的,也有庫存以及優(yōu)惠折扣等業(yè)務(wù)存在。
整個系統(tǒng)交互如下圖:
分布式事務(wù)
上述兩個場景的業(yè)務(wù)需求已經(jīng)說完了,接著談?wù)劮植际绞聞?wù),要說分布式事務(wù)那就先聊聊本地事務(wù)與分布式事務(wù):
Ps:相同點(diǎn):首先都是要保證數(shù)據(jù)正確(即ACID),本地事務(wù)與分布式事務(wù)還可以對應(yīng)為:剛性事務(wù)與柔性事務(wù),在我個人理解剛性事務(wù)與柔性事務(wù)的最大區(qū)別就是:一個完整的事務(wù)操作是否可以在同一物理介質(zhì)(例如:內(nèi)存)上同時完成;柔性事務(wù)就是一個完整事務(wù)需要跨物理介質(zhì)或跨物理節(jié)點(diǎn)(網(wǎng)絡(luò)通訊),那么排它鎖、共享鎖等等就沒有用武之地了(這里并不是指大事務(wù)拆小事務(wù)【本地事務(wù)】后),無法保證原子性(Atomicity)完成事務(wù)。個人理解分布式(柔性)事務(wù)本質(zhì)意義上就是-偽事務(wù),柔性事務(wù)其實(shí)就是根據(jù)不同的業(yè)務(wù)場景使用不同的方法實(shí)現(xiàn)最終一致性,因?yàn)榭梢愿鶕?jù)業(yè)務(wù)的特性做部分取舍,在業(yè)務(wù)過程中可以容忍一定時間內(nèi)的數(shù)據(jù)不一致。
在知乎上面看過一篇文章,支付寶的柔性事務(wù)實(shí)現(xiàn)方式有四種分別針對不同的業(yè)務(wù)場景,如下圖:
回到我們流量交易中心的業(yè)務(wù)場景:
通過Dubbo實(shí)現(xiàn)了微服務(wù)化,大致拆分如下:
場景一:
庫存數(shù)量與訂單數(shù)量一致性,采用補(bǔ)償型+最大努力通知型,采用原因?yàn)椴簧婕翱鐧C(jī)房和長事務(wù)(正常情況下庫存與訂單服務(wù)處理很快):
場景二:
訂單信息、支付信息、充值信息三者之間的一致性,采用異步確保型的原因是,整個業(yè)務(wù)鏈路太長且跨不同的機(jī)房系統(tǒng),網(wǎng)絡(luò)延遲較高,業(yè)務(wù)方面恰好不需要非常高的實(shí)時性,所以采用小事務(wù)+異步通知,目前正常情況下用戶從下單到完成支付到流量到賬平均為1-5分鐘左右:
場景三:
直充到賬后的消息通知(APP消息推送或短信通知),采用最大努力通知型,這個業(yè)務(wù)場景比較簡單,在直充成功后,訂單狀態(tài)流轉(zhuǎn)為已完成,此時通過消息服務(wù)進(jìn)行到賬通知業(yè)務(wù)的解耦,調(diào)用消息服務(wù)失敗的情況下,使用定時任務(wù)努力通知。
場景四:
對賬稽核:
按照支付賬期每日進(jìn)行T+1對賬,對賬原則:以支付交易記錄為準(zhǔn),對流量中心訂單記錄+支付網(wǎng)關(guān)交易記錄+省CRM充值記錄三方比對,將某些中間狀態(tài)的訂單(例如:支付成功、待退款)核對后將訂單狀態(tài)流轉(zhuǎn)完結(jié)(已完成、退款成功)。
結(jié)算稽核:
對賬成功后的數(shù)據(jù)定期進(jìn)入結(jié)算流程,對支付網(wǎng)關(guān)周期內(nèi)的支付金額與結(jié)算數(shù)據(jù)的金額進(jìn)行核對,稽核成功后進(jìn)行財務(wù)結(jié)算流程,將錢結(jié)算給省公司,并提供結(jié)算明細(xì)給省公司,供省公司與直充成本記錄進(jìn)行復(fù)核。
Ps:以下是流量中心的部分架構(gòu)設(shè)計,總體原則方向:微服務(wù)化
流量中心-架構(gòu)設(shè)計
架構(gòu)設(shè)計思想:在系統(tǒng)初期設(shè)計時以及部分硬性環(huán)境約束下,我們根據(jù)業(yè)務(wù)拆分為多個子系統(tǒng)(微服務(wù)):商品服務(wù)、訂單服務(wù)、庫存服務(wù)、支付網(wǎng)關(guān)、統(tǒng)一接口平臺、對賬服務(wù)、結(jié)算服務(wù)、網(wǎng)關(guān)對接服務(wù)等,后續(xù)還會增加:賬戶服務(wù)、虛擬貨幣服務(wù)、卡券服務(wù)等等…。按照微服務(wù)的核心設(shè)計思想,所有服務(wù)完全獨(dú)立、隔離,因此所有服務(wù)從上至下:請求接入(連接管理)、請求處理(計算服務(wù))、數(shù)據(jù)存儲(存儲服務(wù))進(jìn)行拆分,接入與計算盡最大可能實(shí)現(xiàn)無狀態(tài),數(shù)據(jù)存儲進(jìn)行垂直+水平拆分,垂直拆分:商品庫-mysql(讀多寫少,主從架構(gòu)+讀寫分離)+redis(讀多寫少,集群方式)、訂單庫-mysql(讀寫均衡,多主多從+水平拆分)、庫存專用庫-redis(分布式+主備容災(zāi))、外部交易系統(tǒng)-支付網(wǎng)關(guān)、外部辦理系統(tǒng)-統(tǒng)一接口平臺。
Ps:此架構(gòu)目前已支撐總交易額3.6億,總訂單4680萬,日均交易額500萬,日訂單量50萬,后續(xù)業(yè)務(wù)量持續(xù)增加的情況下按照微服務(wù)思想繼續(xù)拆分,例如將訂單服務(wù)再拆分為:下單服務(wù)、查單服務(wù),直到根據(jù)業(yè)務(wù)需求與系統(tǒng)關(guān)系耦合性拆分到最細(xì)粒度為止。
整體拆分原則如下圖:
from:?http://blog.jobbole.com/110805/
總結(jié)
- 上一篇: 关于分布式事务、两阶段提交协议、三阶提交
- 下一篇: 分布式事务之最终一致的Mq实现