Microservice Patterns - 4.1 用 Saga 管理交易 - Microservice 架構中的交易管理
參考資料
挑戰
在單體系統中,createOrder 操作只需要依賴帶有 transactional annotation 的關聯式資料庫。
在 microservice 系統中,createOrder 操作需要確保 Kitchen Service、Customer Service、Order Service、Accounting Service 中的操作全部成功。因為每個服務都有自己的資料庫。

傳統做法
簡單來說:兩階段提交。例如 Java EE 可以透過 JTA 完成多個服務的交易。
問題
- 現代技術如 No-SQL 資料庫或 Message broker(如 Kafka)不支援它。
- 傳統做法是同步操作且可用性較低(所有服務必須都可用)兩個 99.5% 可用性的服務,整體可用性變成 99%
使用 Saga Pattern 維護資料一致性
Saga:透過一連串用非同步 messaging 協調的本地交易來維護跨服務的資料一致性。參見 http://microservices.io/ patterns/data/saga.html。
每個本地交易在單一服務內使用我們熟悉的 ACID 交易框架和函式庫來更新資料
- 系統操作啟動 Saga 的第一步
- 本地交易完成後觸發下一個本地交易的執行
- Saga 必須使用補償交易來回滾
範例:Create Order Saga
- 由外部的 createOrder 請求啟動
- 其他五個交易在前一個完成後觸發

挑戰
- Saga 之間缺乏隔離性
- 發生錯誤時的回滾
SAGA 使用補償交易來回滾變更
當某一步失敗時,先前的 saga 需要復原變更(必須被復原)
