分佈式事務如何拆解成單機事務

   

    這段時間一直在思考分佈式事務的實現,一開始的思路總是停留在應用層面上,後來經過查看相關資料才知道,要支持分佈式事務得需要數據庫的支持,也就還是回到了數據庫層面,另外在Java裏面結合javax.sql擴展包裏面使用兩段提交協議能輕鬆支持分佈式事務。


    後來自己結合之前做過的一些項目,發現原來之前實現的功能已經利用消息隊列把分佈式事務拆解成單機事務了,雖然實時性可能沒有那麼強,但是正常情況下,這種思路還是比較好的一種解決方案。只是以前不知道這個概念,但是卻是實現了這個功能。


    關於分佈式事務的拆解的分析,案例還是上篇文章的案例,由於上篇文章主要寫的重點是突出事務與併發的關係,這邊文章主要想寫分佈式事務如何拆解成單機事務來執行,場景還是使用上篇文章的場景。


  • A系統處理一個事務後修改訂單狀態

  • 通過ActiveMQ通知B系統,B系統收到通知後啓動一個事務來處理跟訂單相關的信息,再通過ActiveMQ告知A系統

  • A系統再啓動一個事務修改訂單狀態

  • 假設訂單狀態正常由第一步驟到第三步驟的狀態變化爲pending---finish


   假設上篇文章的bug我們已經解決,那這個流程就是一個典型的分佈式事務拆解成單機事務的例子,把一個分佈式事務拆分成A系統的兩個單機事務和B系統的一個單機事務。A系統裏面分別啓動了兩個事務來修改訂單狀態,第二個事務啓動的條件是B系統的事務執行完畢並收到確認消息之後。


   然而這個流程可能有很多細節要注意,如:


  • B系統的事務執行失敗,A系統如何重新啓動整個流程

  • B系統如何保證冪等性

  • A系統的第二個事務啓動失敗,A系統如何重新啓動整個流程


  以上問題都是很好解決的我們只需在應用程面多加一些異常處理機制即可保證整個流程執行順暢。在B系統裏面可以根據轉態或者另外建立一張消息表以保證接口的冪等性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章