Saga Pattern
Saga 補償流程
Saga 會把幾個已保存的步驟連成一項業務工作。後面的步驟失敗時,它會重試,或加入另一個步驟來修正前面已做的事。
saga ID + local transaction -> next step; failure -> retry | compensation -> terminal state- ✓機票已保留flight_tx_7
- ✓信用卡已扣款pay_tx_8
- !飯店沒有空房hotel_tx_9
saga ID + local transaction -> next step; failure -> retry | compensation -> terminal stateJOB另一個例子
訂單 `984` 先保留庫存、授權 NT$248,再要求出貨。出貨服務拒絕該地址。Saga 會用相同 Saga ID 取消授權並釋放庫存,最後把訂單記為已補償。
主要部分
- 01Saga ID 與狀態
- 02參與的服務
- 03本機交易步驟
- 04步驟結果訊息
- 05重試或補償
- 06稽核與人工復原
什麼時候用
一項業務工作跨越多個服務或資料庫時,可以使用 Saga。只有在單一全成或全敗的資料庫步驟無法涵蓋整項工作時,才需要它。要定義每個已保存步驟、下一個動作、重試、補救動作和最終狀態。
什麼時候不要用
一次資料庫保存就能完成整項工作時,不要加入 Saga。補救動作也是新的工作。它可能失敗,也可能留下不同結果。某個動作無法安全撤銷時,要交給人員判斷。
程式裡的名稱
saga ID + local transaction -> next step; failure -> retry | compensation -> terminal state 上線前要檢查
檢查介面約定、任何情況都不能破壞的規則、授權與輸入限制。測試重試、重複執行只生效一次、逾時與部分失敗。驗證資料完整性、相容性、監控、復原與回復上一版。
預期成果:為這套系統設計或檢查 Saga 補償流程 (Saga Pattern),並讓資料保持正確、安全且容易維護。 使用者情境:訂單 `984` 先保留庫存、授權 NT$248,再要求出貨。出貨服務拒絕該地址。Saga 會用相同 Saga ID 取消授權並釋放庫存,最後把訂單記為已補償。 技術概念或控制措施:Saga 補償流程 (Saga Pattern)。 適用理由:一項業務工作跨越多個服務或資料庫時,可以使用 Saga。只有在單一全成或全敗的資料庫步驟無法涵蓋整項工作時,才需要它。要定義每個已保存步驟、下一個動作、重試、補救動作和最終狀態。 不應使用的情況:一次資料庫保存就能完成整項工作時,不要加入 Saga。補救動作也是新的工作。它可能失敗,也可能留下不同結果。某個動作無法安全撤銷時,要交給人員判斷。 工程要求:定義輸入、輸出、介面約定,以及任何情況都不能破壞的規則。說明授權與輸入檢查範圍。定義失敗、逾時、重試和重複執行只生效一次的規則。也要定義資料搬移與相容限制。 營運要求:加入監控訊號與隱藏敏感資料的記錄。設定容量上限並寫好操作手冊。測試復原與回復上一版的流程。 驗收條件:介面約定與失敗路徑測試通過。重試或部分失敗時,資料與授權規則仍正確。效能上限、監控、復原與回復上一版的方法都已驗證。 證據與限制(證據邊界):沒有一份官方標準能管到全部內容。不同團隊、平台或框架的用法可能不同。 待確認:程式執行環境、資料位置、流量形態、資料一致需求和安全邊界。也要確認相容期間、服務目標(SLO)與回復上一版的限制。
檢查這份需求
請 AI 程式助手檢查目前如何使用 Saga 補償流程 (Saga Pattern)。 定義:Saga 會把幾個已保存的步驟連成一項業務工作。後面的步驟失敗時,它會重試,或加入另一個步驟來修正前面已做的事。 正式環境檢查:檢查介面約定、任何情況都不能破壞的規則、授權與輸入限制。測試重試、重複執行只生效一次、逾時與部分失敗。驗證資料完整性、相容性、監控、復原與回復上一版。 修改程式前,先列出看到的證據、缺口、嚴重程度,以及最小且安全的修正。