3. 压测场景库设计原则
压测场景库是分布式事务压测的“弹药库”。对于 Saga 超时配置优化而言,场景库的质量直接决定了压测结果能否暴露真实生产问题。本章围绕场景库的构建目标、分类体系以及与超时配置的关联展开,为后续的压测执行与调优奠定基础。
3.1 场景库的构建目标
场景库的构建并非简单罗列接口调用,而是需要服务于以下三个核心目标:
- 覆盖全面性:确保 Saga 事务的每个阶段(正向补偿、反向回滚、超时触发)都有对应的压测场景。
- 结果可复现性:每个场景的输入参数、数据状态、超时阈值必须固化,保证多次压测结果可对比。
- 缺陷暴露性:场景设计应优先覆盖超时配置的“临界点”与“边界值”,而非仅测试正常流程。
实践建议:在构建场景库时,建议为每个场景分配唯一的
scenario_id,并记录其关联的 Saga 事务类型(TCC/Saga/AT)与超时配置参数(如 timeout_ms、retry_count)。这有助于后续自动化回归。
3.2 场景分类:正常、边界、异常
根据压测覆盖度要求,场景库应划分为三大类。下表展示了每类场景的定义、典型示例及其在超时配置优化中的价值:
| 分类 | 定义 | 典型示例 | 超时配置关联价值 |
|---|---|---|---|
| 正常场景 | 所有参与者均在预期时间内完成,无网络抖动或服务故障。 | 订单创建 → 库存扣减 → 支付成功 → 补偿未触发 | 验证超时配置在理想状态下的“安全余量”,确认基线耗时。 |
| 边界场景 | 参与者耗时接近超时阈值,或资源使用率接近上限。 | 库存服务响应耗时 = 超时阈值 - 5ms;数据库连接池使用率 95% | 暴露超时配置的“临界误判”,防止因微小延迟导致误补偿。 |
| 异常场景 | 参与者超时、服务宕机、网络分区或数据不一致。 | 支付服务超时 2s(配置超时 1s);库存服务返回 500 错误 | 验证超时触发后的补偿逻辑正确性,以及重试/降级策略的稳定性。 |
关键原则:异常场景的压测次数应至少占场景库总量的 40%。因为生产环境中,超时配置的优化往往是在异常条件下才暴露真实问题。
3.3 场景库与超时配置的关联
场景库的设计必须与 Saga 超时配置形成“双向映射”。一方面,超时配置参数决定了场景的边界值;另一方面,压测结果反过来驱动超时配置的调整。下图展示了这种关联关系:
上图揭示了两个关键映射关系:
- 压测结果 → 超时配置调整:当边界场景或异常场景出现误补偿时,需要反向调整
timeout_ms或compensation_delay。 - 超时配置 → 场景边界定义:超时配置的数值直接决定了“正常”与“异常”的分界线,场景库中的边界场景必须围绕这些数值设计。
3.4 场景库构建流程
基于上述原则,推荐采用以下步骤构建压测场景库:
- 枚举 Saga 事务路径:列出所有正向补偿与反向回滚路径,形成事务拓扑图。
- 标注超时配置点:在每个参与者调用处标注当前超时配置(如
timeout_ms=500)。 - 生成三类场景:为每个配置点生成正常、边界、异常三类压测用例。
- 固化场景参数:将场景的输入数据、预期结果、超时阈值写入场景库配置文件。
- 自动化回归绑定:将场景库与 CI/CD 流水线集成,每次超时配置变更后自动触发验证。
避坑提示:不要将所有异常场景都设计为“立即超时”。生产环境中,超时往往伴随部分成功、部分失败的情况。建议在异常场景中引入“部分参与者成功,部分超时”的混合模式,以验证 Saga 协调器的部分补偿能力。
3.5 场景库配置示例
以下是一个简化的场景库配置文件片段(YAML 格式),展示了如何将超时配置与场景定义关联:
scenarios:
- id: "saga_order_normal_001"
type: "normal"
saga_type: "TCC"
participants:
- service: "inventory"
timeout_ms: 500
expected_duration_ms: 300
- service: "payment"
timeout_ms: 1000
expected_duration_ms: 600
validation:
compensation_triggered: false
total_duration_ms: < 1500
- id: "saga_order_boundary_001"
type: "boundary"
saga_type: "TCC"
participants:
- service: "inventory"
timeout_ms: 500
expected_duration_ms: 495 # 接近超时阈值
- service: "payment"
timeout_ms: 1000
expected_duration_ms: 400
validation:
compensation_triggered: false
total_duration_ms: < 1500
- id: "saga_order_exception_001"
type: "exception"
saga_type: "TCC"
participants:
- service: "inventory"
timeout_ms: 500
expected_duration_ms: 600 # 模拟超时
- service: "payment"
timeout_ms: 1000
expected_duration_ms: 300
validation:
compensation_triggered: true
compensation_path: "inventory_rollback"