传奇模式和分布式交易
传奇模式和分布式事务
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,您的多服务业务流程将变得可预测和可持续。