?
問題描述:
最近在做專案程序中遇到這樣一種場景:方法A依次呼叫方法B、C、D,其中方法B和D都是本地方法,方法C是遠程方法(更具體的講,方法C的功能是發送MQ訊息),該場景要求方法A是滿足事務的,即A呼叫B、C、D要么同時成功,要么同時失敗,
問題分析:
該問題的難點在于,對于方法B和D,可以通過本地事務支持回滾,對于方法C,不是一個簡單的遠程呼叫,是一個發送MQ訊息的方法,本地事務不支持回滾,也無法手動調方法回滾,該如何解決?
幾種可能的方案:
方案一:將方法C的執行放到最后,保證其他方法執行成功后再執行方法C,這種方案不需要處理回滾;
方案二:使用分布式事務,支持回滾;
方案一:
需要保存方法C的中間結果,然后在所有方法執行完之后再去處理發送訊息,關于如何保存中間結果我想到兩種方法:一是用快取,二是用ThreadLocal,
用快取保存中間結果:
可以使用執行緒ID作為快取key,把中間結果放到快取中,設定一個快取時間,在最后從快取中取資料進行處理,處理完要清理快取,
用ThreadLocal保存中間結果:
可以封裝一個工具類,內部定義ThreadLocal的get/set/remove方法,這里一定要注意及時清理ThreadLocal,防止執行緒復用導致問題,
方案二:
使用事務訊息,
這里介紹一下事務訊息的執行程序:

?編輯
事務訊息需要提供兩個介面:
本地事務執行介面:根據事務執行情況回傳3種狀態:Commit、Rollback、UNKNOW,
本地事務狀態查詢介面:如果本地事務執行超時,或回傳UNKNOW,MQ服務器呼叫該介面輪詢事務狀態,
綜合以上方案,筆者最終選擇了ThreadLocal方案,原因是該方案相對簡單,不需要引入外部依賴,該方案的注意點是要及時清理ThreadLocal,讀者如果有更好的方案或建議可以交流交流,
?轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/538573.html
標籤:架構設計
下一篇:分布式事務問題
