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 进行恢复验证。
- 循环编排:重复执行场景序列,用于稳定性测试。
回放机制是场景库的闭环:
- 录制:在生产环境或预发环境录制 gRPC 调用链和事务状态。
- 脱敏:对 Payload 中的敏感字段进行脱敏处理。
- 回放:在压测环境按原时间戳或加速时间戳回放 gRPC 请求。
- 比对:对比回放结果与录制结果的事务状态、gRPC 状态码、延迟分布。
关键指标:回放保真度 = 回放结果与录制结果的事务状态一致率。目标保真度 > 99.5%,否则场景库无法用于故障定位。
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 通信下的各类故障模式,为后续的故障定位算法提供可复现、可度量、可对比的测试基础。