摘要:在競爭如此激烈的當下,作為一名IT新人,怎麼才能讓HR眼前一亮,從萬千簡歷中脫穎而出成為最亮的那個崽呢? 本文分享自華為雲社區《【一行代碼秒上雲】連夜自建網站背刺我的求職對手們 !》,作者:AppCloud小助手。 前言 在競爭如此激烈的當下,作為一名IT新人,怎麼才能讓HR眼前一亮,從萬千簡 ...
問題描述:
最近在做項目過程中遇到這樣一種場景:方法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。讀者如果有更好的方案或建議可以交流交流。