4. 压测场景库设计:压测场景的分类、元数据模型与场景编排

压测场景库是Saga链路追踪故障定位的“弹药库”。一个设计良好的场景库,能够覆盖生产环境的真实负载特征,并在故障发生时提供可复现、可对比的基线数据。本节从场景分类、元数据模型、场景编排与参数化三个维度展开。

4.1 压测场景的分类

根据测试目标与负载特征,压测场景分为三大类:容量场景、稳定性场景、异常场景。每类场景在Saga链路追踪中的关注点不同。

场景类别 核心目标 Saga链路关注点 典型压测指标
容量场景 确定系统最大吞吐与资源拐点 各Saga步骤的耗时分布、队列积压深度 TPS、P99延迟、CPU/内存利用率
稳定性场景 验证长时间运行下的资源与数据一致性 补偿事务触发率、悬挂事务数、链路超时比例 长时间TPS波动、GC频率、DB连接池水位
异常场景 模拟故障注入,验证容错与恢复能力 补偿链路完整性、幂等重试次数、状态机卡住节点 故障恢复时间、数据不一致率、告警延迟
实践建议:在Saga压测中,容量场景优先关注“正向链路”的吞吐上限;稳定性场景需额外监控“补偿事务”的累积量;异常场景则必须验证“部分成功+部分回滚”时链路追踪是否能完整记录所有分支状态。

4.2 场景库的元数据模型

为了让压测场景可检索、可复现、可对比,需要定义统一的元数据模型。以下为核心字段设计:

// 压测场景元数据模型(JSON Schema 示例)
{
  "sceneId": "string",                // 场景唯一ID
  "sceneName": "string",              // 场景名称
  "category": "capacity|stability|fault", // 场景分类
  "sagaFlowId": "string",             // 关联的Saga流程定义ID
  "loadProfile": {                    // 负载配置
    "type": "fixed|ramp|step|spike",
    "concurrency": 100,
    "durationSec": 600,
    "rampUpSec": 60
  },
  "faultInjections": [                // 异常场景专用
    { "targetStep": "payment", "faultType": "timeout", "delayMs": 5000 }
  ],
  "dataSeed": {                       // 数据参数化
    "userIdRange": [10001, 20000],
    "orderAmountDistribution": "normal",
    "skuCount": 500
  },
  "expectedSla": {                    // 预期SLA
    "p99Ms": 2000,
    "maxCompensationRate": 0.05
  },
  "tags": ["v2.3", "redis-cluster", "payment-saga"],
  "createTime": "2025-03-01T10:00:00Z"
}
关键设计原则:
  • 场景与Saga流程解耦:元数据中只引用 sagaFlowId,不内嵌流程定义,便于复用。
  • 负载配置可参数化:支持固定并发、阶梯递增、突发峰值三种模式,覆盖容量与稳定性需求。
  • 故障注入显式声明:异常场景必须明确标注目标步骤与故障类型,便于链路追踪自动标记异常区间。
压测场景元数据模型结构 场景元数据 场景标识 负载配置 故障注入 数据种子 预期SLA 并发数 时长 递增模式 目标步骤 故障类型 元数据模型支持按 sceneId、category、tags 快速检索,便于在故障定位时回溯匹配的压测场景

4.3 场景编排与参数化

场景编排解决“如何按顺序执行多个压测子场景”的问题;参数化解决“如何生成差异化请求数据”的问题。两者结合,才能模拟真实业务流。

4.3.1 场景编排模式

  • 串行编排:场景A执行完毕后执行场景B。适用于“先容量摸底,再稳定性验证”的流程。
  • 并行编排:多个场景同时执行,共享同一份Saga流程定义。适用于模拟多用户并发操作不同Saga分支。
  • 条件编排:根据前序场景的SLA达标情况,决定是否执行后续场景。例如:容量场景P99超过阈值时,自动跳过稳定性场景并触发告警。
  • 循环编排:对同一场景反复执行,每次使用不同的参数化数据集。适用于“数据驱动”的回归压测。
注意:在Saga链路追踪场景中,编排时必须保证每个子场景的 sagaFlowId 一致,否则链路追踪无法跨场景关联同一笔分布式事务的完整状态。

4.3.2 参数化策略

参数化数据直接影响Saga链路的覆盖度。推荐以下策略:

参数化维度 策略说明 Saga链路覆盖目标
用户ID 从预置用户池中随机选取,支持热点用户模拟 验证用户维度的幂等性与补偿隔离性
订单金额 正态分布 + 边界值(0元、超大额) 触发不同金额下的Saga分支(如风控审核)
库存SKU 部分SKU设置为低库存,部分为充足 验证库存扣减失败时的补偿事务完整性
支付渠道 轮询余额支付、信用卡、第三方支付 覆盖不同支付渠道的超时与重试逻辑
时间戳偏移 模拟跨天、跨月、跨年的订单时间 验证Saga状态机中的时间窗口判断
场景编排与参数化流程 场景编排引擎 串行编排 并行编排 条件编排 循环编排 参数化数据源:用户池 | 金额分布 | SKU库存 | 支付渠道 | 时间偏移 压测执行计划(含Saga Flow ID) 编排引擎根据元数据中的 loadProfile 和 dataSeed 自动生成可执行的压测计划

4.4 场景库与Saga链路追踪的集成

场景库设计完成后,需要与Saga链路追踪系统打通,实现“场景-链路-故障”的闭环:

  • 场景标签注入:每个压测请求的Trace中携带 sceneId 与 category 标签,便于在链路追踪中按场景维度聚合分析。
  • 基线自动建立:容量场景执行完毕后,自动将P50/P90/P99延迟写入场景元数据的 expectedSla 字段,作为后续异常检测的基线。
  • 故障场景回放:当生产环境出现Saga补偿事务异常时,直接从场景库中检索相同 sagaFlowId 的异常场景进行回放,验证修复效果。
落地检查清单:
  1. 场景库是否覆盖了所有Saga流程的“正向+补偿”路径?
  2. 元数据中的 loadProfile 是否支持阶梯递增与突发峰值两种模式?
  3. 参数化数据是否包含边界值与异常值(如金额为0、库存为负)?
  4. 编排引擎是否能在场景执行前自动校验 sagaFlowId 的一致性?