傳奇模式和分布式交易
傳奇模式和分布式事務
1)為什麼需要傳奇
經典2PC(雙相固定)的縮放不佳,在故障下復雜並阻止了資源。傳奇將整個業務流程分為一系列本地事務(步驟),每個事務都獨立進行營銷。失敗時,將取消後續步驟,並且已完成的步驟將被反向操作補償。
結果:管理事件一致性,沒有全球鎖定,高生存能力和明確的恢復協議。
2)基本模型
2.1個編排
專用的傳奇協調員控制步驟:發送命令,等待響應/事件,發起補償。
優點:集中控制,簡單可觀察性,明確的截止日期。缺點:附加組件。
2.2編舞
沒有協調員;服務相互響應事件(「OrderPlaced」 → 「PaymentCaptured」 → 「InventoryReserved……」)。
優點:薄弱的連通性。缺點:更難追蹤,沒有明確規則的「死亡舞蹈」風險。
2.3 TCC (Try-Confirm/Cancel)
資源凍結選項:1.Try-準備/儲備,
2.Confirm-固定,
3.Cancel-回滾。
擔保較高,但合同和儲備金定時更為復雜。
3)步驟和補償合同
每個步驟=本地交易+補償(相等,允許重復)。
補償沒有完全「收回和平」的義務-足夠的域對等(例如,「退還付款」而不是「刪除付款」)。
定義不變量:對於金錢-資產負債表不會進入負值;對於訂單-沒有「掛起」狀態。
輸入截止日期/TTL備份和「垃圾收集器」以進行逾期嘗試。
4)交付的一致性和語義
消息傳遞:在默認情況下(默認)→所有操作都必須是相等的。
順序:通過相關鍵(例如「order_id」,「player_id」)很重要。
Exactly once不是傳奇的目的;我們通過等效鍵、outbox/inbox和正確的通訊來實現高效的整數。
5)傳奇的狀態和她的日誌
什麼是存儲:- 「saga_id」,「correlation_id」,當前狀態(運行/完成/匹配/匹配/失敗),
- 步驟及其變量(付款/準備金的ID),
- 事件/決定的歷史(日誌),時間表,截止日期,撤退次數。
- 可供協調員使用的單獨的Saga Store(表/文件)。
- 對於編舞,是將狀態事件發布到公共拓撲中的本地「代理」傳奇。
6)可靠發布模式: outbox/inbox
Outbox:此步驟會推銷更改,並在單個事務中將事件/命令記錄到outbox表中;制造商發布到總線。
收件箱:消費者維護已處理的「message_id」表格→ dedup+等效性。
成功副作用後,commitim offset/ACK(Kafka/RabbitMQ)不早。
7)傳奇步驟設計
7.1示例(在iGaming/電子商務中購買)
1.PlaceOrder → 「PENDING」狀態。
2.AuthorizePayment (Try) → `payment_hold_id`.
3.ReserveInventory → `reservation_id`.
4.CapturePayment (Confirm).
5.FinalizeOrder → `COMPLETED`.
賠償:- 如果(3)「CancelPaymentHold」 →失敗;
- (4)在(3)→ 「ReleaseInventory」之後失敗;
- 如果(5)→ 「RefundPayment」和「ReleaseInventory」失敗。
7.2 個截止日期/retrai
指數延遲+jitter的最大N中繼。
超出後-過渡到「比較」。
為每個步驟存儲next_attempt_at和deadline_at。
8)編曲家vs平臺
變體:- 輕型家庭編排器(微服務+Saga表)。
- 平臺:Temporal/Cadence、Camunda、Netflix Conductor、Zeebe-提供計時器、中繼、長壽鍛煉、可見性和網絡控制臺。
- 要編排,請使用事件目錄和嚴格的狀態/鍵約定。
9)集成協議
9.1異步(Kafka/RabbitMQ)
命令: 'payments。authorize.v1`, `inventory.reserve.v1`.
事件: 'payments。authorized.v1`, `inventory.reserved.v1`, `payments.captured.v1`, `payments.refunded.v1`.
派對鍵=順序的'order_id'/'player_id'。
9.2同步(HTTP/gRPC)
對於「短」步驟是允許的,但始終具有計時器/後置/冪和後退到異步補償中。
10)相似性和鑰匙
在命令和補償請求中,傳送「idempotency_key」。
副作用(寫入DB/註銷)有條件地執行:「如果尚未看到'idempotency_key',則執行」。
補償也是偶然的:重播「RefundPayment(id=X)」是安全的。
11)錯誤處理
類是:- Transient(網絡/時間)→ retrai/backoff。
- 業務(資金不足,限制)→立即補償/替代途徑。
- 可逆性(不變性破壞)→手動幹預,「手動」補償。
- 建立解決方案矩陣:錯誤類型→操作(retry/compensate/escalate)。
12)可觀察性和SLO sag
SLI/SLO:
端到端後期傳奇(p50/p95/p99)。
成功率(未補償完成的比例為)。
Mean time to compensate и compensation rate.
Orphaned sagas(懸掛)和GC之前的時間。
跟蹤:「trace_id」/「saga_id」作為步驟之間的span鏈接;錯誤預算的burn-rate度量標準。
Logi:傳奇狀態的每次變化=有原因的結構化記錄。
13)示例(偽代碼)
13.1編曲家(想法)
python def handle(OrderPlaced e):
saga = Saga. start(e. order_id)
saga. run(step=authorize_payment, compensate=cancel_payment)
saga. run(step=reserve_inventory, compensate=release_inventory)
saga. run(step=capture_payment, compensate=refund_payment)
saga. run(step=finalize_order, compensate=refund_and_release)
saga. complete()
def run(step, compensate):
try:
step () # local transaction + outbox except Transient:
schedule_retry()
except Business as err:
start_compensation(err)
13.2 Outbox(表格創意)
outbox(id PK, aggregate_id, event_type, payload, created_at, sent_at NULL)
inbox(message_id PK, processed_at, status)
saga(order_id PK, state, step, next_attempt_at, deadline_at, context JSONB)
saga_log(id PK, order_id, time, event, details)
13.3編舞(主題想法)
`orders.placed '→消費者: 'payments。authorize`, `inventory.reserve`
`payments.authorized` + `inventory.reserved` → `orders.try_finalize`
任何拒絕→ 'orders。compensate 「→由」payments啟動。cancel/refund`, `inventory.release`.
14)與2PC和ES的比較
2PC:強烈的一致性,但鎖定,瓶頸,「銅管」。
傳奇:事件一致性,需要補償和遙測學科。
事件來源:將事件存儲為真理的來源;它的傳奇是自然的,但增加了遷移/狙擊的復雜性。
15)安全和合規性
Transport Security (TLS/mTLS), ACL per topic/queue。
在事件中-最低PII,敏感字段加密,令牌化。
審核對傳奇和補償日誌的訪問。
與外部提供商(付款/交付)的SLA=截止日期和轉發限制參數。
16)實施清單(0-45天)
0-10天
突出顯示候選流程(多服務、補償)。
選擇模型(編排/編排/TSS)和相關密鑰。
描述步驟/補償、不變性和截止值。舉起「saga」、「outbox」、「inbox」表。
11-25天
啟用outbox/inbox、Idempentity和backoff retrai。
取消第一個傳奇;添加SLI/SLO行列板和跟蹤。
寫一本補償書(包括手動的)和升級。
26-45天
自動化GC「掛式」傳奇,定期重新啟動/繼續截止日期。
進行遊戲日:步驟故障,過期,經紀人無法訪問。
標準化事件合同(版本、兼容性),建立「sag目錄」。
17)反模式
「補償=從DB刪除」代替域正確反向動作。
沒有outbox/inbox →事件丟失/雙重效果。
沒有jitter的retrai →依賴性的DDoS本身。
期望在沒有「處理」的情況下在閱讀上具有強烈的一致性。
一個巨大的管弦樂隊全→控制整體。
完全無視編舞,SLA →無法控制的舞蹈。
忽略截止日期→永恒的儲備/丘陵。
18)成熟度量
≥ 90%的關鍵過程被傳奇/補償覆蓋,並具有描述的不變性。
Outbox/inbox集成到所有Tier-0/1生產者/消費者中。
SLO:正常的p95端到端傳奇,成功率穩定,orphaned<目標。
透明的跟蹤和行進板「通過步驟」,燃燒率差。
季度的遊戲日和手寫的跑步補償檢查。
19)結論
傳奇是分布式系統的實用一致性合同:明確步驟和反向行動,發布紀律(outbox/inbox),截止日期和轉發,可觀察性和補償過程。選擇一個模型(編排/編排/TSS),記錄不變式和密鑰,使處理程序相等-如果沒有昂貴的2PC,您的多服務業務流程將變得可預測和可持續。