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 超时配置形成“双向映射”。一方面,超时配置参数决定了场景的边界值;另一方面,压测结果反过来驱动超时配置的调整。下图展示了这种关联关系:

场景库与超时配置关联架构图 场景库与超时配置双向关联 压测场景库 正常场景(基线) 耗时 < 超时阈值 × 60% 边界场景(临界) 耗时 ≈ 超时阈值 ± 10ms 异常场景(超时/故障) 耗时 > 超时阈值 + 随机抖动 场景覆盖率 ≥ 90% 超时配置参数 timeout_ms 全局超时阈值(ms) retry_count 超时后重试次数 compensation_delay 补偿触发延迟(ms) 配置调优目标 压测结果驱动 超时阈值调整 配置参数定义 场景边界条件 双向关联:场景库验证配置,配置优化场景库

上图揭示了两个关键映射关系:

  • 压测结果 → 超时配置调整:当边界场景或异常场景出现误补偿时,需要反向调整 timeout_ms 或 compensation_delay。
  • 超时配置 → 场景边界定义:超时配置的数值直接决定了“正常”与“异常”的分界线,场景库中的边界场景必须围绕这些数值设计。

3.4 场景库构建流程

基于上述原则,推荐采用以下步骤构建压测场景库:

  1. 枚举 Saga 事务路径:列出所有正向补偿与反向回滚路径,形成事务拓扑图。
  2. 标注超时配置点:在每个参与者调用处标注当前超时配置(如 timeout_ms=500)。
  3. 生成三类场景:为每个配置点生成正常、边界、异常三类压测用例。
  4. 固化场景参数:将场景的输入数据、预期结果、超时阈值写入场景库配置文件。
  5. 自动化回归绑定:将场景库与 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"