GH GambleHub

傳奇模式和分布式交易

傳奇模式和分布式事務

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,您的多服務業務流程將變得可預測和可持續。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。