系列12-接口压测怎么做成平台能力?自研 httpx 引擎、分布式 Worker 与 Locust 选型对照 系列12-接口压测怎么做成平台能力自研 httpx 引擎、分布式 Worker 与 Locust 选型对照团队做性能测试常见两条路Locust / 自写脚本灵活但 URL/Body/Token 与接口回归两套维护报告散落本地 HTMLJMeter GUI功能全但 XML 难维护CI 集成重BrickCore 选第三条复用接口自动化用例ApiTestCase asyncio/httpx 自研压测引擎可选Perf Worker水平加并发。需要先说清一点平台没有嵌入 LocustDocker 镜像也不带 Locust 依赖执行层借鉴 Locust 的并发用户 / Ramp-up / 分布式 Worker产品思路HTTP 请求与变量替换与run_single_case同源build_perf_request→ httpx。演示与源码地址功能演示http://43.142.83.156/showcase/ 性能测试相关说明见文档中心平台 admin / BrickCore123456开源仓库https://gitee.com/BanZhuanKeOrz/BrickCore线上路径性能测试 → 场景管理 / 执行机 / 执行记录。Worker 推荐BrickCoreRunner v1.3.14选「压测执行机」角色上线。一、平台化压测要解决什么脚本压测痛点平台化做法Swagger 已导入压测又要抄一遍 URL场景引用已有 ApiTestCase测试/预发 Host、Token 各写各的Environment Token 授权 merge_execution_variables报告不在统一看板PerfRecord落库 曲线 多轮对比单机并发不够Perf Worker注册、按比例拆并发大模型 SSE 接口只看总 RTstream_burstqa_sse_v1阶段指标二、架构一图读懂PerfScene场景scene_items config csv ↓ POST /perf/exec/{scene_id}?use_workers PerfRecordconfig_snapshot 不可变快照 ↓ run_perf_sceneBackgroundTasks ┌─────────────────┬──────────────────────────┐ │ 本机 asyncio │ 分布式 use_workerstrue │ │ Backend httpx │ distribute_concurrent │ │ 虚拟用户协程池 │ → Perf Workerperf_worker│ └─────────────────┴──────────────────────────┘ ↓ 秒级聚合 time_series_data 报告QPS / P95 / error_rate / case_aggregations / phase_metrics与 UI Runner 分工Perf Worker 只跑HTTP 压测UI Runner 跑 Playwright队列协议不同系列09。三、数据模型PerfScene ├─ scene_items: [{case_id, weight, delay_ms}, ...] ├─ config: {mode, concurrent_users, ramp_up_seconds, ...} └─ csv_data csv_config PerfRecord一次执行 ├─ config_snapshot / scene_items_snapshot ├─ total_requests, qps, p95, error_rate, time_series_data ├─ case_aggregations接口维度 ├─ phase_metrics / request_detailsSSE 场景 └─ distribution_info分布式 Worker 分配 PerfWorker ├─ register / heartbeat / unregister ├─ max_concurrent └─ project_id须与场景项目一致快照设计场景事后被改历史报告仍对应当时的配置与用例列表——发版对比靠record_id不靠「还记得上次参数」。四、五种压测模式mode说明典型场景fixed固定并发 持续时长秒稳态容量验证loop固定并发 每用户循环 N 次固定请求总量stepping多阶段递增并发与时长梯度加压、找拐点stream_burst每虚拟用户1 次SSE 流式请求采集问答各阶段耗时大模型 / 流式 APIjourney_fixed/journey_loop业务链路多阶段顺序执行步骤间 extractors 传参登录→业务接口固定/循环/梯度模式还可勾选流式问答在持续压测中对指定用例走 SSE 引擎use_stream_execution。场景项示例权重 思考时间概念对齐 Locusttask(weight)between[{case_id:101,weight:3,delay_ms:500},{case_id:102,weight:1,delay_ms:0}]配置示例{mode:fixed,concurrent_users:50,ramp_up_seconds:10,duration_seconds:120,error_rate_threshold:5,request_detail_level:brief}error_rate_threshold错误率连续 3 秒超阈值自动停压workers.py中ERROR_RATE_AUTO_STOP_MSG。五、执行链路源码5.1 启动# routers/perf/exec.py — start_perfrecordawaitPerfRecord.create(scene_idscene_id,statuspending,trigger_typemanual,config_snapshotconfig,scene_items_snapshotscene.scene_items,)background_tasks.add_task(run_perf_scene,record.id,use_workers)5.2 run_perf_scene 核心步骤读快照解析env_id、Host可target_host覆盖环境Host 连通性探测HEAD失败则record.statusfailed预加载ApiTestCaseApiDefinitionmerge_execution_variables合并项目/环境变量构建scene_items_for_worker含 merged headers/body减少 Worker 侧查库分支本机 asyncio或分布式 Worker5.3 本机虚拟用户 信号量# _perf_worker_fixedrandom.choices(case_pool, weights...) 按 weight 选接口asyncwithsem:# sem concurrent_usersresultawait_execute_perf_case_request(case,env,target_host,client,csv_row,...)ifdelay_ms0:awaitasyncio.sleep(delay_ms/1000)_execute_perf_case_request走 httpx成功判定status 500 且断言通过与功能回归同源断言逻辑。5.4 分布式并发拆分# routers/perf/workers.py — distribute_concurrent# 按各 Worker max_concurrent 比例分配且不超过单节点上限assignmentsdistribute_concurrent(total_concurrent,workers)Worker 侧引擎与 Backend同一套runner/perf_worker.pyBrickCoreRunner 内置或命令行启动秒级指标 POST/workers/{record_id}/report结束后finalize汇总。硬约束journey_*模式若含阶段sync_before屏障不支持分布式——引擎会直接 failed 并提示改单机执行journey_has_sync_barrier校验。六、复用接口用例变量与断言压测不另写 locustfile请求构建走build_perf_requestall_variablesensure_dt_cache(awaitmerge_execution_variables(case.project_id,env.id))# csv_row 列 → ${{username}}# journey 步骤间 session_variablesextractorsmethod,url,headers,params,body,timeout,body_type...能力说明${{env_var}}与接口回归同一套替换${{df:标签}}/${{dt:...}}数据工厂、插入工具CSV 列${{username}}等断言压测仍执行失败计入 error_rate可弱化非关键断言实操压测前用接口用例单跑确认 Host、Token、Body再挂到场景里加权。七、CSV 参数化csv_data存 JSON 数组csv_config.strategystrategy行为round_robin虚拟用户轮询各行unique每用户绑定一行用户数 ≤ 行数random随机取行分布式下get_next_csv_row(..., worker_id, total_workers)避免多 Worker 抢同一行。八、Perf Worker 部署推荐 BrickCoreRunner8.1 客户端方式推荐安装BrickCoreRunner v1.3.14登录 → 执行角色仅压测或UI 压测选择压测项目与平台顶部项目 ID 一致→上线性能测试 → 执行机确认在线场景执行勾选使用分布式 Worker客户端会话区 runner/logs/perf_worker.log可看秒级 QPS/RT下线自动unregister不必等心跳超时。8.2 命令行CI / 高级cdrunner python perf_worker.py--masterhttp://你的平台地址\--tokenmy-local-token\--name压测机-01\--max-concurrent200\--project-id 当前项目ID生产环境浏览器访问一般为80 端口Nginx--master不要写 :8000。8.3 何时勾选 Worker场景建议小并发冒烟、链路调试不勾选Backend 本机执行高并发、多机叠加 QPS勾选 Worker无在线 Worker自动降级本机cron 同理九、流式 / SSE 与大模型压测stream_burst模式 stream_profile.parser_id默认qa_sse_v1每用户一次完整 SSE 会话采集首字时间、思考耗时、各阶段 RT→phase_metrics报告支持SSE 阶段汇总、流式明细懒加载、导出 Excelrequest_detail_leveldetailed可保留成功 trace不影响 QPS/RT 聚合固定/循环/梯度模式也可对指定用例勾选流式执行适合「混合流量里夹 SSE 接口」。十、业务链路Journeyjourney_fixed/journey_loop多phase顺序/并行步骤间extractors → session_variables等价压测版「登录→下单」{mode:journey_fixed,concurrent_users:20,duration_seconds:300,journey:{phases:[{name:登录,execution:serial,steps:[{case_id:101,delay_ms:0}]},{name:下单,execution:serial,sync_before:false,steps:[{case_id:102,delay_ms:200}]}]}}sync_before: true为阶段屏障全链路用户齐步走——仅单机分布式请关闭或改journey_fixed单机压测。十一、报告读什么指标说明发版决策QPS / 成功 QPS吞吐是否达 SLAavg / P90 / P95 / P99延迟分布长尾是否恶化error_rate失败占比对照阈值、自动停压time_series_data秒级曲线是否「越压越慢」case_aggregations分接口统计定位慢接口分位采样说明接口维度 P90/P95/P99 基于最多 5000 条RT 样本蓄水池采样MAX_CASE_RT_SAMPLES总请求数、QPS、错误率、Min/Max 仍统计全量。超大规模压测时分位为近似值报告页有说明。支持多 record 对比、HTML 导出、完成后邮件/钉钉/企微推送maybe_auto_push_perf_report。十二、与 Locust 选型对照维度Locust 脚本BrickCore 平台压测接口定义locustfile 手写引用 ApiTestCase环境切换改代码/环境变量换env_id分布式master/workerPerf Worker 比例分配权重/间隔task/betweenweight / delay_msSSE 阶段需自写解析stream_burst qa_sse_v1报告本地 HTML落库 曲线 对比 通知依赖Locustasyncio httpx镜像更轻外部仍有 Locust 脚本时结果需自行对接平台侧重与接口资产、定时任务、看板一体。十三、发版前压测 SOP场景核心 35 个接口weight按生产流量比例环境独立压测环境勿误打生产冒烟10 并发 × 60s 本机验证用例与 CSV加压stepping或提高concurrent_users勾选 Worker阈值设error_rate_threshold如 5%对比与同场景上一版record_id比 P95、error_rate归档评审贴 record 链接可选定时压测PerfCronJobuse_workers十四、常见排错现象原因处理Host 不可达env.host 错 / 网络检查环境exec 前有 HEAD 探测Worker 不分配无在线 / project_id 不一致执行机页看 heartbeatRunner 选对项目分布式启动 failedjourney sync_before关屏障或单机error_rate 100%Token/Body 错接口用例单跑通过再压QPS 很低delay_ms 大 / 断言过重 / 瓶颈在被测方调参看 time_series与 Locust 数值差连接复用、模型不同看趋势与相对对比不必抠绝对值一致分位与 Locust 差很多5000 样本蓄水池看全量 QPS/错误率知悉分位为近似十五、小结平台压测 ApiTestCase 资产 asyncio/httpx 自研引擎不是嵌入 Locust。五种模式覆盖稳态、梯度、SSE、业务链路快照保证报告可追溯。Perf Worker与 Backend同引擎distribute_concurrent按容量比例拆并发。CSV 变量合并与接口回归同源报告支持对比、SSE 阶段、自动停压与通知。附录 A源码文件索引顺序文件关注点1models/perf.pyPerfScene / PerfRecord / PerfWorker / PerfCronJob2routers/perf/exec.pystart_perf、run_perf_scene、各 mode worker3routers/perf/workers.pyregister、distribute_concurrent、秒级上报4modules/perf/perf_journey.py链路编排、sync 屏障5modules/stream_phase/SSE 解析、stream_burst6runner/perf_worker.py分布式 Worker 执行引擎7routers/perf/cron.py定时压测、use_workers降级选型背景docs/ROADMAP.md零 Locust 依赖、直接复用接口用例变量/断言Docker 部署更轻。支持与交流演示http://43.142.83.156/showcase/ · 源码https://gitee.com/BanZhuanKeOrz/BrickCore觉得有用欢迎Star⭐问题评论区留言或 Gitee Issues