1.同步場景:
1)、 讀場景:首頁推薦商品列表:商品信息,用戶信息,社交信息
2)、 寫場景 購買商品:下單-》A ; 減庫存-》B ;支付-》C
2.解決方案:
1)、基於異步補償的分佈式事務
2)、架構設計的三大關鍵點
如以寫場景爲例:針對每個步驟的請求都需要在事務補償服務的數據庫中存放事務id , state, ts , 每個微服務數據訪問層提供補償接口,如下圖:
3.業務邏輯層proxy設置(基於AOP實現)
3.1.邏輯層調用上加上事務註解@Around("execution(* *(..)) && @annotation(TX)")
3.2.Proxy在真正業務邏輯被調用之前,生成一個全局唯一TXID標示事務組,TXID保存在ThreadLocal變量裏,方法開始前寫入,完成後清除,並向遠端數據庫寫入TXID並把事務組置爲開始狀態
3.3.業務邏輯層調用數據庫訪問層之前,通過RpcProxy代理記錄當前調用參數
3.4.如果業務正常,調用完成後,當前方法的調用記錄存檔或刪除
3.5.如果業務異常,查詢調用鏈反向補償
4.數據訪問層設計
4.1.原子接口
4.2.補償接口
誰來提供, 冪等性保證
4.3.基於原則接口方法,在方法名加註解標註補償方法名
@Compensable (cancelMethod="cancelRecord")
5.分佈式事務補償服務
5.1.事務組表(數據庫表TDB)
記錄事務組狀態
txid\state\timestamp
5.2.事務調用組表(數據庫表TDB)
記錄事務組內的每一次調用 以及相關參數
Txid,actionid,callmethod,pramatype,params
5.3.補償策略
調用執行失敗,修改事務組狀態,
分佈式事務補償服務異步執行補償