# PRD - 两种压测场景增强需求文档

> **文档版本**: v1.1
> **创建日期**: 2026-08-22
> **模块类型**: 性能测试
> **优先级**: P1
> **关联文档**: `_PRD_两种压测场景增强_计划执行.md`

> **v1.1 变更**：新建任务弹窗改为两种类型选择（瞬时并发 / 长稳压测）；长稳压测升级为**多接口混合负载模型**（导入多个接口 + 每接口独立线程数分配 + 接口维度指标分解）。

---

## 一、背景与目标

### 1.1 背景

当前性能测试模块支持三种压测模式（concurrent 固定并发、qps 固定 QPS、step 阶梯加压），均基于**单接口 + 持续时长**驱动。此模式无法覆盖两个关键测试场景：

1. **瞬时并发（Burst/Spike Test）**：模拟海量用户在极短时间内同时发送请求，验证系统能否扛住瞬间流量尖峰。例如全体参会人员同时入会、秒杀预约同时抢单。当前引擎的 Semaphore 并发控制是"请求发完一个再取一个"，而非"所有线程同时发送"。

2. **长稳压测（Endurance/Stability Test）**：模拟真实用户持续使用系统 8 小时，检测内存泄漏、连接池耗尽、响应时间退化。真实业务流量是**混合的**——多种接口同时被访问，各有不同占比和频率，单接口压测无法还原真实负载模型。

### 1.2 目标

1. **新建弹窗双类型选择**：新建任务时提供两种类型（瞬时并发 / 长稳压测），选择后展示完全不同的表单设计与参数集。
2. **瞬时并发场景**：集合点（Synchronizing Timer）机制，所有线程等待到设定数量后同时发出请求；循环次数控制；Ramp-Up 支持 0 秒瞬间启动。
3. **长稳压测场景（多接口混合负载）**：支持导入多个接口，每个接口独立分配线程数；思考时间（Think Time）模拟真实用户；无限循环 + 调度器 Duration；CSV 参数化按线程分配账号；报告提供**接口维度指标分解**。
4. **curl 导入为主流程**：瞬时并发导入单条 curl；长稳压测支持批量导入多条 curl，逐条生成接口条目。
5. **兼容存量任务**：已有 concurrent/qps/step 任务不受影响，编辑时回退旧表单。

---

## 二、场景与功能范围

### 2.1 场景一：瞬时并发测试（Burst / Spike Test）— 单接口

| 特性 | 说明 | 优先级 |
|------|------|--------|
| 集合点（Synchronizing Timer） | 所有线程等待到设定数量后同时发出请求，实现"瞬间齐发" | P0 |
| 循环次数控制 | 执行指定次数后停止（非按持续时间停止），典型 loop_count=1 | P0 |
| Ramp-Up 0 秒 | 支持 ramp_up=0，所有线程瞬间启动 | P0 |
| 错误动作（Error Action） | 请求失败时继续（Continue）或停止（Stop） | P1 |
| 高并发数支持 | 线程数上限扩展至 1000 | P1 |

**典型场景示例：**

```
场景：全体参会人员同时入会（1000 人同时请求）
- 接口：1 个（入会接口，curl 导入）
- 线程数：1000
- Ramp-Up：0（瞬间创建所有线程）
- 循环次数：1（只发一次请求）
- 集合点：启用，阈值 1000，超时 30s
- 错误动作：Continue
```

> 瞬时并发仅支持单接口（齐发的意义在于同一接口的瞬间冲击）。如需多接口瞬时并发，使用批量执行功能组合多个 burst 任务。

### 2.2 场景二：长稳压测（Endurance Test）— 多接口混合负载

| 特性 | 说明 | 优先级 |
|------|------|--------|
| 多接口导入 | 支持导入多个接口（多条 curl 批量导入 / 逐条添加），每个接口独立配置 | P0 |
| 每接口线程分配 | 每个接口分配独立线程数，总并发 = 各接口线程数之和 | P0 |
| 思考时间（Think Time） | 请求间插入延迟，模拟真实用户操作间隔（Constant / Gaussian） | P0 |
| 无限循环 + 调度器 | 持续运行直到调度器到达设定时长（28800s = 8h） | P0 |
| CSV 参数化 | 从 CSV 加载账号池，每个线程分配不同身份凭证 | P1 |
| 接口维度指标分解 | 报告中按接口统计请求数/响应时间/错误率/TPS | P0 |
| Duration 扩展 | 支持最长 28800 秒（8 小时） | P1 |

**多接口线程分配模型：**

```
场景：8 小时混合业务负载稳定性测试
┌─────────────────────────────────────────────────┐
│ 接口列表（3 个接口，总并发 200）                  │
├─────────────────────────────────────────────────┤
│ ① 查询会议列表   GET  /api/meeting/list    80线程│
│ ② 提交预约      POST /api/meeting/book     60线程│
│ ③ 发送心跳      POST /api/heartbeat        60线程│
├─────────────────────────────────────────────────┤
│ 总线程数：200（自动汇总，= 80+60+60）             │
│ Ramp-Up：120s（所有接口的线程共同渐进启动）        │
│ 调度器时长：28800s（8 小时）                      │
│ 思考时间：Gaussian，均值 2000ms，偏差 500ms       │
│ CSV 参数化：200 行账号，按全局线程索引分配         │
└─────────────────────────────────────────────────┘
```

每个接口的线程组独立循环：各自执行"请求 → 思考时间 → 请求"的节奏，互不干扰，共同构成混合负载。CSV 参数化按**全局线程索引**分配（接口①的线程 0-79 用账号 0-79，接口②的线程用账号 80-139，依此类推），确保每个虚拟用户身份唯一。

**典型场景示例：**

```
- 接口：3 个（curl 批量导入）
- 线程分配：80 / 60 / 60（总 200，约日并发量的 60%-80%）
- Ramp-Up：120s
- 循环类型：无限循环
- 调度器 Duration：28800s（8 小时）
- 思考时间：Gaussian Random Timer，均值 2000ms，偏差 500ms
- CSV 参数化：启用，200 行账号数据
- 错误动作：Continue
```

---

## 三、参数设计

### 3.1 场景类型字段

| 参数名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `scenario_type` | string | `null` | 场景类型: `burst`(瞬时并发) / `endurance`(长稳压测)；**存量任务为 null，表示标准模式（concurrent/qps/step）** |

### 3.2 瞬时并发参数（单接口，复用现有字段 + 新增）

接口配置复用现有 `target_url` / `method` / `headers` / `body` 字段（curl 导入直接回填）。

| 参数名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `loop_type` | string | `"finite"` | 循环类型: `finite`(有限次) / `infinite`(无限) |
| `loop_count` | int | 1 | 有限循环次数，burst 典型值 1 |
| `synchronizing_timer_enabled` | bool | false | 是否启用集合点 |
| `synchronizing_timer_count` | int | 0 | 集合点阈值，到达该数量线程后齐发（默认=线程数） |
| `synchronizing_timer_timeout` | int | 30000 | 集合点等待超时(ms) |
| `error_action` | string | `"continue"` | 错误动作: `continue` / `stop` |

现有字段约束变更：

| 参数名 | 变更 | 说明 |
|--------|------|------|
| `concurrency` | 上限 500 → 1000 | burst 场景需要 1000+ |
| `ramp_up` | 保持 ge=0 | 已支持 0 |

### 3.3 长稳压测参数（多接口）

#### 3.3.1 接口列表 `scenario_apis`（JSON 数组，每个元素一个接口）

| 属性 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `name` | string | 是 | 接口名称（报告展示用，如"查询会议列表"） |
| `method` | string | 是 | HTTP 方法 |
| `url` | string | 是 | 接口完整 URL |
| `headers` | dict | 否 | 请求头（curl 导入回填） |
| `body` | any | 否 | 请求体（curl 导入回填） |
| `thread_count` | int | 是 | 分配线程数（≥1） |
| `assertions` | list | 否 | 接口级断言规则 |
| `unique_fields` | list | 否 | 接口级唯一性字段配置 |

#### 3.3.2 任务级长稳参数

| 参数名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `duration` | int | 28800 | 调度器时长(秒)，上限从 3600 扩展至 28800 |
| `ramp_up` | int | 120 | 预热时间(秒)，所有接口线程共同渐进启动 |
| `loop_type` | string | `"infinite"` | 长稳固定为无限循环，由调度器控制停止 |
| `think_time_enabled` | bool | false | 是否启用思考时间（全局，对所有接口生效） |
| `think_time_min` | int | 1000 | 均值/固定值(ms) |
| `think_time_max` | int | 3000 | gaussian 偏差上限(ms) |
| `think_time_distribution` | string | `"constant"` | 分布类型: `constant` / `gaussian` |
| `csv_parameterization_enabled` | bool | false | 是否启用 CSV 参数化 |
| `csv_content` | string | `""` | CSV 内容（首行表头，逗号分隔，上限 10000 字符） |
| `csv_variable_mapping` | dict | `{}` | CSV 列名→变量名映射，如 `{"username":"user","password":"pass"}` |
| `error_action` | string | `"continue"` | 错误动作 |
| `concurrency` | int | 自动计算 | 总并发 = sum(各接口 thread_count)，保存时后端自动计算 |

> 思考时间为**全局配置**（v1 版本），对所有接口统一生效；每接口独立思考时间为后续扩展（P2）。

### 3.4 场景预设

选择类型后自动填充预设参数，仍可手动调整：

**瞬时并发预设：**
```
scenario_type = "burst"
loop_type = "finite", loop_count = 1
synchronizing_timer_enabled = true
synchronizing_timer_count = concurrency（跟随线程数联动）
synchronizing_timer_timeout = 30000
ramp_up = 0
error_action = "continue"
```

**长稳压测预设：**
```
scenario_type = "endurance"
scenario_apis = []（待导入接口）
loop_type = "infinite"
duration = 28800
ramp_up = 120
think_time_enabled = true
think_time_min = 1000, think_time_max = 3000
think_time_distribution = "gaussian"
csv_parameterization_enabled = false
error_action = "continue"
```

---

## 四、UI 设计

### 4.1 新建弹窗 — 类型选择第一步

点击"新建任务"先弹出**类型选择卡片**（或弹窗顶部醒目的双卡片选择区），确认后进入对应表单：

```
┌─ 选择压测类型 ────────────────────────────────────────────┐
│                                                            │
│  ┌──────────────────────┐   ┌──────────────────────────┐  │
│  │  ⚡ 瞬时并发          │   │  ⏱ 长稳压测              │  │
│  │                      │   │                          │  │
│  │  海量用户同一瞬间     │   │  多接口混合负载           │  │
│  │  齐发请求，验证系统   │   │  持续压测 8 小时，        │  │
│  │  流量尖峰承受能力     │   │  检测内存泄漏/性能退化    │  │
│  │                      │   │                          │  │
│  │  集合点齐发·单接口    │   │  多接口·每接口独立线程    │  │
│  └──────────────────────┘   └──────────────────────────┘  │
└────────────────────────────────────────────────────────────┘
```

选择后展示完全不同的表单。表单内提供"切换类型"入口（切换时保留任务名称/项目/HTTP 配置中可复用的部分，清空场景参数重新预设）。

### 4.2 瞬时并发表单（单接口）

```
┌─ ⚡ 瞬时并发 [切换类型] ─────────────────────────────┐
├─ 基础配置 ──────────────────────────────────────────┤
│  任务名称: [________]   归属项目: [________]          │
│  [📥 从 curl 导入]                                    │
├─ 接口配置（单接口）─────────────────────────────────┤
│  Method: [POST ▼]  URL: [______________________]     │
│  请求头(JSON): [textarea]                            │
│  请求体(JSON): [textarea]                            │
├─ 瞬时并发配置 ──────────────────────────────────────┤
│  线程数:   [1000  ] (1-1000)                         │
│  Ramp-Up:  [0     ] 秒  ← 预设 0，瞬间启动            │
│  循环次数: [1     ] (每线程执行次数)                  │
│  ☑ 启用集合点（所有线程到齐后同时发出请求）            │
│    ├ 集合点阈值: [1000  ] ← 默认=线程数，联动          │
│    └ 超时时间:  [30000 ] ms                           │
│  错误动作: (●) 继续  ( ) 停止                         │
├─ 认证配置 ──────────────────────────────────────────┤
│  ☑ 需要登录认证  账号: [superadmin ▼]                │
│  ☐ 请求需要签名                                       │
└──────────────────────────────────────────────────────┘
```

### 4.3 长稳压测表单（多接口混合负载）

```
┌─ ⏱ 长稳压测 [切换类型] ─────────────────────────────────────┐
├─ 基础配置 ──────────────────────────────────────────────────┤
│  任务名称: [________]   归属项目: [________]                  │
│  [📥 批量导入 curl]  [+ 手动添加接口]                        │
├─ 接口列表（每个接口独立线程组）───────────────────────────────┤
│  ┌────────────────────────────────────────────────────────┐ │
│  │ ① [查询会议列表    ] GET  /api/meeting/list    线程[80] │ │
│  │                    [展开编辑: 请求头/请求体/断言/唯一字段] │ │
│  │                                                [删除]  │ │
│  ├────────────────────────────────────────────────────────┤ │
│  │ ② [提交预约        ] POST /api/meeting/book     线程[60] │ │
│  │                                                [删除]  │ │
│  ├────────────────────────────────────────────────────────┤ │
│  │ ③ [发送心跳        ] POST /api/heartbeat       线程[60] │ │
│  │                                                [删除]  │ │
│  └────────────────────────────────────────────────────────┘ │
│  总线程数: 200（自动汇总 = Σ 各接口线程数）                   │
├─ 调度配置 ──────────────────────────────────────────────────┤
│  Ramp-Up: [120   ] 秒（所有接口线程共同渐进启动）             │
│  调度器时长: [28800 ] 秒  ≈ 8.0 小时  (1-28800)              │
├─ 思考时间（模拟真实用户操作间隔）─────────────────────────────┤
│  ☑ 启用思考时间                                              │
│    分布: ( ) 固定  (●) 高斯随机                              │
│    均值: [2000] ms   偏差上限: [3000] ms（gaussian 时显示）    │
├─ CSV 参数化（账号池，每线程独立身份）─────────────────────────┤
│  ☐ 启用 CSV 参数化                                           │
│    CSV 内容: [username,password / user1,pass1 / ...]         │
│    变量映射: {"username":"user","password":"pass"}            │
│    → 接口的 URL/请求头/请求体中用 {{user}} {{pass}} 引用       │
├─ 错误动作 ──────────────────────────────────────────────────┤
│  (●) 继续  ( ) 停止                                          │
├─ 认证配置 ──────────────────────────────────────────────────┤
│  ☑ 需要登录认证  账号: [superadmin ▼]                        │
└──────────────────────────────────────────────────────────────┘
```

### 4.4 表单交互逻辑

1. **批量导入 curl**：多行输入，每行（或每个以 `curl` 开头的块）解析为一条接口，逐条调用现有 parse-curl API，生成接口条目（name 取 URL 末段，线程数默认 10）
2. **线程数联动**：总线程数实时汇总显示（只读）；集合点阈值（burst）默认跟随线程数
3. **接口条目展开编辑**：默认折叠只显示 名称/方法/URL/线程数，展开后编辑 headers/body/断言/唯一字段
4. **切换类型**：保留任务名称、项目；瞬时并发↔长稳压测切换时，单接口配置转入接口列表第一条（或反之），场景参数重置为预设
5. **Duration 友好提示**：长稳场景输入框旁显示 `≈ 8.0 小时` 换算
6. **CSV 变量校验**：保存时校验变量映射 JSON 格式；CSV 行数小于总线程数时提示"线程将循环复用账号"

### 4.5 存量任务编辑兼容

- `scenario_type = null` 的存量任务（concurrent/qps/step）：编辑时展示**现有旧表单**（模式选择器等），不出现类型切换入口
- 存量任务列表、执行、报告、批量执行完全不受影响

---

## 五、引擎变更

### 5.1 执行入口分支

```python
async def execute(self, task, snapshot_callback):
    scenario = getattr(task, "scenario_type", None)
    if scenario == "burst":
        result = await self._run_burst(task)
    elif scenario == "endurance":
        result = await self._run_endurance(task)
    else:
        # 现有 concurrent/qps/step 逻辑完全不变
        ...
```

### 5.2 瞬时并发 `_run_burst`（集合点同步屏障）

```
每个线程的执行流程：
1. 创建（ramp_up=0 时全部瞬间创建）
2. 到达集合点，等待 barrier
3. 等待线程数达到阈值（或超时）→ 所有线程同时发出请求
4. 记录响应
5. loop_count 未完成 → 回到 2（新一轮齐发）；完成 → 线程结束
6. 全部线程结束 → 压测结束（不依赖 duration）
```

实现方式：`asyncio.Barrier`（Python 3.11+ 内置，含 timeout 支持）；集合点超时后 barrier 进入 broken 状态，已到达线程照常发送（与 JMeter Synchronizing Timer 超时行为一致）。

### 5.3 长稳 `_run_endurance`（多接口混合负载）

```
启动流程：
1. 解析 scenario_apis → 接口线程组列表
2. 解析 CSV → 账号池，按全局线程索引预分配
3. Ramp-Up 期间渐进启动所有接口的线程：
   总启动间隔 = ramp_up 秒，按总线程数均匀间隔创建
   （接口①80线程 + 接口②60线程 + 接口③60线程 = 200 线程，
     每 ramp_up/200 秒启动一个）
4. 每个线程循环：发送本接口请求 → 思考时间 → 下一轮
5. 调度器：await sleep(duration) 到时后 self._running = False
6. 所有线程退出 → 汇总结束
```

**接口维度指标**：每次请求记录时携带 `api_name` 标签，汇总阶段生成 `api_summary`（每接口的请求数/成功/失败/avg/min/max/P95/TPS/错误率），复用现有 `transaction_summary` 的结构模式存储与展示。

### 5.4 CSV 参数化

- 解析：`csv.DictReader` 解析 `csv_content`，按 `csv_variable_mapping` 重命名列 → 变量字典列表
- 分配：`thread_params = csv_rows[global_thread_index % len(csv_rows)]`
- 注入：线程启动时绑定本线程变量，每次请求通过现有 `TemplateResolver` 将接口 URL/headers/body 中的 `{{变量名}}` 替换为线程变量值

### 5.5 思考时间

```python
if distribution == "gaussian":
    delay = gauss(mean=think_time_min, sigma=(think_time_max - think_time_min) / 3)
    delay = clamp(delay, 0, think_time_max * 2)
else:  # constant
    delay = think_time_min
await asyncio.sleep(delay / 1000)
```

在每次请求完成后、下一次请求前插入；不影响 TPS 计算（TPS 按请求处理统计）。

---

## 六、数据库变更

### 6.1 PerformanceTask 新增字段

| 字段名 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `scenario_type` | String(20) | `null` | `burst` / `endurance`；null=存量标准模式 |
| `scenario_apis` | JSON | `null` | 长稳接口列表（结构见 3.3.1）；burst 与存量任务为 null |
| `loop_type` | String(10) | `"finite"` | `finite` / `infinite` |
| `loop_count` | Integer | 1 | 有限循环次数 |
| `synchronizing_timer_enabled` | Boolean | false | 启用集合点 |
| `synchronizing_timer_count` | Integer | 0 | 集合点阈值 |
| `synchronizing_timer_timeout` | Integer | 30000 | 集合点超时(ms) |
| `error_action` | String(10) | `"continue"` | `continue` / `stop` |
| `think_time_enabled` | Boolean | false | 启用思考时间 |
| `think_time_min` | Integer | 1000 | 均值/固定值(ms) |
| `think_time_max` | Integer | 3000 | gaussian 偏差上限(ms) |
| `think_time_distribution` | String(10) | `"constant"` | `constant` / `gaussian` |
| `csv_parameterization_enabled` | Boolean | false | 启用 CSV 参数化 |
| `csv_content` | Text | `""` | CSV 内容 |
| `csv_variable_mapping` | JSON | `{}` | CSV 列→变量映射 |

### 6.2 现有字段约束变更（仅 Schema 层）

| 字段名 | 变更 |
|--------|------|
| `concurrency` | 上限 500 → 1000 |
| `duration` | 上限 3600 → 28800 |

### 6.3 结果汇总新增字段

| 字段名 | 类型 | 说明 |
|--------|------|------|
| `api_summary` | JSON | 长稳接口维度指标汇总（复用 transaction_summary 模式） |

### 6.4 迁移策略

使用项目已有 `_ensure_columns` 模式，服务启动时自动补充缺失列，无需手动迁移脚本。

---

## 七、边界与约束

### 7.1 集合点限制

- 集合点阈值 ≤ 并发数（否则永远等不满，只能靠超时放行）
- 集合点仅 burst 场景可用；endurance（思考时间场景）与集合点互斥
- 集合点超时后 broken barrier 放行已到达线程，不等后续线程

### 7.2 长稳多接口限制

- `scenario_apis` 至少 1 个接口，每接口 `thread_count ≥ 1`，接口数上限 20（防误操作）
- `concurrency` 由后端保存时自动计算为 sum(thread_count)，前端只读展示
- CSV 行数 < 总线程数时按取模复用（提示但不阻断）；CSV 内容上限 10000 字符
- duration 上限 28800s；快照按秒采集，8 小时约 28800 条快照记录（见 7.4）

### 7.3 兼容性

- 存量任务（`scenario_type=null`）走原 concurrent/qps/step 路径，行为完全不变
- 现有表单字段（target_url 等）继续服务 burst 单接口与存量任务
- 批量执行、合并报告、监控页对两类新场景任务同样可用（新字段不阻断现有流程）

### 7.4 长时执行的技术约束

- 8 小时快照量：约 28800 条/任务。入库为每秒 1 条 INSERT，SQLite 可承受；报告页图表需做降采样展示（前端按最大 500 点抽样渲染，后端可原样返回）
- WebSocket 长连接可能中断，前端已有重连机制（3 次）；监控页刷新后可从快照接口恢复

---

## 八、验收标准

### 8.1 瞬时并发场景

- [ ] 新建弹窗可选择"瞬时并发"，表单仅展示 burst 相关参数
- [ ] Ramp-Up=0 时所有线程瞬间启动
- [ ] 启用集合点，所有线程等待到阈值后**同时**发出请求（可通过首秒 TPS 尖峰验证）
- [ ] 循环次数=1，所有线程发送一次后任务自动结束（不依赖 duration）
- [ ] 循环次数>1，每轮重新集合
- [ ] 集合点超时机制生效（超时后已到达线程放行）
- [ ] 错误动作=Stop 时任意线程失败触发整体停止
- [ ] 1000 并发执行正常不 OOM

### 8.2 长稳压测场景

- [ ] 新建弹窗可选择"长稳压测"，表单展示接口列表编辑器
- [ ] 批量导入多条 curl，逐条生成接口条目
- [ ] 每接口可独立设置线程数，总线程数自动汇总
- [ ] 多接口线程组并发运行，各自独立循环
- [ ] 无限循环 + 调度器到达 duration 后正常停止（短时长验证，如 60s）
- [ ] Constant Timer 固定延迟生效；Gaussian 延迟随机分布
- [ ] CSV 参数化生效，不同线程使用不同账号（按全局线程索引分配）
- [ ] 报告展示**接口维度指标分解表**（每接口请求数/RT/TPS/错误率）
- [ ] Duration=28800 可保存执行

### 8.3 UI 表单

- [ ] 类型选择卡片展示两种类型，选择后表单切换
- [ ] 切换类型保留任务名称/项目，场景参数重置预设
- [ ] 从 curl 导入（burst 单条 / endurance 批量）回填正确
- [ ] 集合点阈值默认联动线程数
- [ ] 编辑 burst/endurance 任务回填正确；编辑存量任务展示旧表单
- [ ] `npm run build` 通过

### 8.4 兼容性

- [ ] 存量任务列表/编辑/执行/报告正常
- [ ] 现有 concurrent/qps/step 执行结果与之前一致
- [ ] 批量执行含新场景任务时正常排队执行
- [ ] 数据库迁移自动完成，无数据丢失

---

## 九、依赖关系

| 依赖项 | 说明 |
|--------|------|
| `asyncio.Barrier` | Python 3.11+ 内置（含 timeout）；如需兼容更低版本用 Condition 自实现 |
| `TemplateResolver` | 现有模板变量替换，CSV 参数化复用 `{{var}}` 语法 |
| `parse-curl` API | 现有 curl 解析端点，endurance 批量导入在前端逐条调用 |
| `MetricsCollector` | 现有指标采集器，扩展 `api_name` 标签维度 |
| `_ensure_columns` | 现有数据库自动迁移模式 |
| `transaction_summary` | 现有结构模式，`api_summary` 复用其存储与展示方式 |

---

## 十、风险与应对

| 风险 | 应对 |
|------|------|
| 1000 协程同时创建，事件循环/内存压力 | TCPConnector 连接池复用；并发上限 1000；burst 不叠加思考时间 |
| Barrier 等待期间监控推送中断 | 快照采集协程独立运行，不受 barrier 阻塞影响 |
| 多接口线程组启动顺序导致负载不均 | Ramp-Up 按总线程数均匀交错启动各接口线程 |
| 8 小时快照 28800 条，图表渲染卡顿 | 前端降采样渲染（最大 500 点）；后端存储不变 |
| CSV 与登录认证冲突（不同账号各自登录） | v1 版本：CSV 变量仅注入请求配置，登录 Token 仍用统一账号；每线程独立登录为后续扩展 |
| 表单弹窗内容过长 | 接口条目默认折叠；思考时间/CSV 参数化不启用时收起 |
| burst 与思考时间同时启用导致语义混乱 | UI 层互斥控制：burst 场景不展示思考时间配置 |