3. 压测场景库设计:压测场景分类、事务模型定义、负载模型参数化、场景编排与回放

分布式事务压测场景库是故障定位的基础设施。一个设计良好的场景库,必须覆盖从单节点故障到跨数据中心网络分区的完整故障空间,同时保证压测结果可复现、可对比。本节从场景分类、事务模型、负载参数化、编排回放四个维度展开。

3.1 压测场景分类

根据分布式事务的典型故障模式,压测场景分为以下五大类:

分类 故障域 典型场景 gRPC 通信特征
节点故障 单点/多点宕机 协调者崩溃、参与者宕机、集群脑裂 连接断开、RST 流、超时重试
网络故障 链路/分区 丢包、延迟抖动、带宽限速、网络分区 gRPC 流控触发、Keepalive 超时、UNAVAILABLE 状态码
资源故障 CPU/内存/磁盘 CPU 打满、OOM、磁盘 IO Hang 请求排队、内存分配失败、gRPC 写入阻塞
协议故障 gRPC 层 Metadata 损坏、Payload 截断、流 ID 冲突 HTTP/2 RST_STREAM、GOAWAY、PROTOCOL_ERROR
事务语义故障 分布式事务 Prepare 超时、Commit 丢失、二阶段回滚冲突 事务状态机与 gRPC 状态码映射异常
设计原则:每个场景必须包含故障注入点、预期行为、gRPC 状态码变化三个要素,否则无法用于故障定位。

3.2 事务模型定义

事务模型是压测场景的核心抽象。在分布式事务压测中,我们定义以下三种基础事务模型:

  • 原子事务模型(Atomic Transaction Model):对应二阶段提交(2PC)或三阶段提交(3PC),事务状态机包含 INIT → PREPARE → COMMIT/ABORT。gRPC 调用链为 Client → Coordinator → Participant。
  • 补偿事务模型(Saga Transaction Model):对应 Saga 模式,事务由多个本地事务组成,每个本地事务对应一个补偿操作。gRPC 调用链为 Client → Saga Orchestrator → Service A → Service B → ...。
  • 混合事务模型(Hybrid Transaction Model):结合 2PC 与 Saga,适用于跨数据中心的全局事务。gRPC 调用链包含跨集群的 Inter-DC gRPC Stream。

每个事务模型在场景库中必须定义以下元数据:

// 事务模型定义示例(Protobuf 描述)
message TransactionModel {
  string model_id = 1;                    // 模型唯一标识
  TransactionType type = 2;               // ATOMIC | SAGA | HYBRID
  repeated string participant_services = 3; // 参与者 gRPC 服务列表
  int32 timeout_ms = 4;                   // 事务超时时间
  map<string, string> retry_policy = 5;   // 重试策略(max_retries, backoff)
  repeated StateTransition states = 6;    // 状态机定义
}
实践建议:事务模型定义应直接映射到 gRPC 的 Unary 和 Server Streaming 调用模式。例如,2PC 的 Prepare 阶段使用 Unary 调用,而 Saga 的补偿链使用 Streaming 调用以支持长连接。

3.3 负载模型参数化

负载模型参数化决定了压测的压力特征和故障触发概率。参数化维度包括:

参数维度 参数项 取值范围 对故障定位的影响
并发度 虚拟用户数、gRPC Stream 数 1 ~ 10000 高并发下暴露连接池泄漏、流控瓶颈
请求速率 QPS、TPS 10 ~ 100000 速率突增触发 gRPC 背压、内存 OOM
数据规模 Payload 大小、事务上下文大小 1KB ~ 10MB 大 Payload 暴露 gRPC 分片、流控窗口问题
故障概率 故障注入率、超时率 0% ~ 100% 概率性故障验证事务状态机健壮性
时间模式 恒定、阶梯、脉冲、随机 自定义时间序列 时间模式匹配真实业务流量特征

参数化配置示例:

# 负载模型参数化 YAML 配置
load_profile:
  concurrency:
    type: "step"           # 阶梯递增
    start: 10
    end: 1000
    step: 50
    duration: 30s          # 每阶梯持续 30 秒
  payload_size:
    distribution: "normal" # 正态分布
    mean: 4096             # 4KB
    stddev: 1024           # 1KB
  fault_injection:
    probability: 0.05      # 5% 概率注入网络延迟
    delay_ms: 200          # 延迟 200ms
注意:参数化不是简单的随机取值。每个参数组合必须对应一个故障触发条件。例如,当并发度 > 500 且 Payload > 1MB 时,gRPC 的 RESOURCE_EXHAUSTED 状态码出现概率显著上升,这个阈值就是故障定位的关键边界。

3.4 场景编排与回放

场景编排将场景分类、事务模型、负载参数组合成可执行的压测流程。编排引擎需要支持:

  • 顺序编排:场景 A → 场景 B → 场景 C,用于复现故障链。
  • 并行编排:场景 A 与场景 B 同时执行,用于验证资源隔离性。
  • 条件编排:如果场景 A 触发故障,则执行场景 B 进行恢复验证。
  • 循环编排:重复执行场景序列,用于稳定性测试。

回放机制是场景库的闭环:

  1. 录制:在生产环境或预发环境录制 gRPC 调用链和事务状态。
  2. 脱敏:对 Payload 中的敏感字段进行脱敏处理。
  3. 回放:在压测环境按原时间戳或加速时间戳回放 gRPC 请求。
  4. 比对:对比回放结果与录制结果的事务状态、gRPC 状态码、延迟分布。
关键指标:回放保真度 = 回放结果与录制结果的事务状态一致率。目标保真度 > 99.5%,否则场景库无法用于故障定位。
压测场景编排与回放流程 场景分类库 事务模型库 负载参数库 场景编排引擎 顺序 / 并行 / 条件 / 循环 压测执行层(gRPC 调用 + 故障注入) 并发控制 | 速率控制 | 故障注入 | 数据采集 录制 → 脱敏 → 回放 → 比对 故障定位报告

3.5 场景库与故障定位的映射关系

场景库设计的最终目标是快速定位故障根因。每个场景必须关联以下故障定位元数据:

场景 ID 故障类型 gRPC 状态码 事务状态 定位线索
SC-001 协调者宕机 UNAVAILABLE PREPARE_TIMEOUT 检查协调者心跳、gRPC 连接池
SC-002 网络分区 DEADLINE_EXCEEDED COMMIT_LOST 检查网络延迟、Keepalive 配置
SC-003 Payload 截断 INTERNAL STATE_MISMATCH 检查 gRPC 消息分片、流控窗口
SC-004 CPU 打满 RESOURCE_EXHAUSTED PREPARE_BLOCKED 检查 CPU 使用率、gRPC 线程池
最佳实践:场景库应包含正向场景(无故障)和负向场景(有故障)的配对。正向场景用于建立基线,负向场景用于验证故障定位算法的召回率。正向与负向场景的比例建议为 1:3。

通过上述设计,压测场景库能够系统性地覆盖分布式事务在 gRPC 通信下的各类故障模式,为后续的故障定位算法提供可复现、可度量、可对比的测试基础。