分散式事務解決方案一之:可靠訊息最終一致性
SOA場景下,會出現呼叫遠端插入資料,本地插入資料失敗後,遠端存在髒資料的問題,為此可通過
可靠訊息解決分散式事務的最終一致性。
場景:先呼叫遠端插入資料,在呼叫本地插入資料,實現訊息的最終一致性,假設都只有單表插入資料,其他業務不做處理
主要流程分支如下:
1.遠端插入失敗,傳送error訊息,本地接受到error訊息,不做插入處理–結果:都為插入
2.遠端插入成功,傳送ok訊息,本地接受ok訊息,本地插入失敗,傳送error訊息(帶有remitrecordid引數方便遠端自己回滾)
3.遠端插入成功,傳送ok訊息,本地接受ok訊息,本地插入成功,傳送ok訊息
可能問題:
1.遠端插入失敗,傳送的訊息我沒收到,沒問題啊,我也沒插入,你也沒插入
2.遠端插入成功,傳送ok訊息我沒收到,導致我本地沒有做插入,解決方案可以把訊息持久化資料庫,定時查詢遠端傳送OK訊息,但是本地未接受的訊息,對本地做插入操作
2.遠端插入成功,傳送ok訊息,本地插入失敗,傳送error訊息後遠端沒收到,沒有回滾遠端的資料,沒問題,訊息持久化定時查詢本地傳送error訊息,遠端未接受的訊息,對遠端做回滾操作
3.遠端插入成功,傳送ok訊息,本地接受ok訊息,本地插入成功,傳送ok訊息的遠端沒收到,沒關係,我插入了,你也插入了嘛
關於訊息持久化的引數:
訊息內容:json字串形式,比如{“ppMerchantNo”:”0000000110000044″,”productCode”:”WECHAT”,”providerCode”:”0000000″,”remitRecordId”:”MHRMT20170810101647200wFDJ6we”,”settleRecordId”:”MHCAL20170710151931024HSCEOLc”,”status”:”error”}
訊息狀態”已傳送,已接收
訊息內容的狀態:ok,error,配置出來這個是因為我們如果遠端傳送給本地Error訊息,本地沒收到,對雙方都沒影響,我直接不處理了,可以減少定時補償訊息和資料的數量
訊息傳送者:本地
訊息接受者:遠端