作者:杜亦舒
來源:微信公眾號:性能與架構
出處:https://mp.weixin.qq.com/s?__biz=MzA4Nzc4MjI4MQ==&mid=2652404032&idx=1&sn=f3e7d518e7cbbe797d4eefbf355e27da
本文目的是講清楚 SAGA 這種分布式事務解決方案的實現思路,不包括具體實現代碼,具體實現推薦使用阿里的Seata 框架。
內容包括:
補充:
常用的分布式事務解決方案還包括TCC、 可靠消息模式 。
比如說電商系統中,用戶下單了,後端需要調用:
在分布式的微服務架構中,每個服務都會有自己獨立的資料庫,那麼,這個下單的動作就涉及到了向多個資料庫中寫入數據。
因為不是在同一個資料庫中,所以就不能依賴資料庫的事務機制了,但是在業務邏輯中,這幾個寫庫操作就應該是一個事務。
比如訂單服務、庫存服務中都寫入成功了,但物流系統出現異常了,那麼訂單服務、庫存服務就應該進行回滾,來保證整體數據的一致性。
如何在跨資料庫的情況下實現事務呢?這就是分布式事務問題。
SAGA 就是一種老牌的分布式事務解決方案,已經有20來年了,其實現方式主要有兩種:
下面介紹一下各自的實現思路。
Choreography 是編舞的意思,就是把舞者之間的動作配合都編排好。
對應到分布式事務,就可以把各個服務理解為舞者,SAGA 的 Choreography 策略就是要定義好先執行哪個服務,根據執行結果再觸發哪些服務的執行。
如上圖,整體分布式事務處理流程為:
這樣,通過事件機制,各個服務之間完成協同配合,實現了分布式事務。
下面看異常情況的處理,比如物流服務異常了,如下圖。
重點看異常處理流程:
這樣就實現了分布式事務的異常處理。
SAGA Choreography 策略是通過【事件機制】實現的,各個服務都定義好正常、異常的處理方法,然後監聽目標事件,根據不同的事件來調用不同的處理方法。
此策略好處是實現簡單,壞處是整體事件邏輯會比較複雜,比如有10個服務參與其中,那麼整體事件訂閱關係就會很凌亂。
Orchestration 是樂隊編排的意思。
對應到分布式事務,各個服務就是樂隊中的各個演奏者,還需要一個【總指揮】,所以在 SAGA - Orchestration 策略中會單獨創建一個此角色。

如上圖,正常處理流程:
......
後面的就不細說,都是一個思路。
異常處理的思路也是一樣的,還是假設物流服務異常了,那麼它會向總指揮報告,總指揮就會向訂單服務、庫存服務發送回滾的指令。
所以 Orchestration 策略的重點在於總指揮,需要為其定義指揮手冊,以便總指揮在不同的時刻向相應的服務發送對應的指令。
這個總指揮實際上是通過【狀態機】來實現的。
此策略好處是服務之間沒有關聯了,整體結構清晰。壞處是都了一個總指揮的角色,增加了複雜度。
Choreography 策略是通過事件機制實現的,每個服務都監聽自己所關心的事件,每個服務執行後會發送相應的事件,監聽此事件的服務執行相應的處理邏輯。
Orchestration 是通過狀態機來實現的整體控制,定義整體的處理流程,不同狀態下需要觸發的動作。
作者:杜亦舒
來源:微信公眾號:性能與架構
出處:https://mp.weixin.qq.com/s?__biz=MzA4Nzc4MjI4MQ==&mid=2652404032&idx=1&sn=f3e7d518e7cbbe797d4eefbf355e27da