Files
company-celebration/packages/server/load-test
empty 5c5d0ad85c feat: 优化100人并发投票支持 + 修复奖项名称硬编码问题
服务端优化:
- Socket.IO 配置优化,支持高并发 WebSocket 连接
- 添加 connectTimeout、perMessageDeflate 等参数

压测脚本:
- 新增 vote-real-scenario.yaml 真实场景压测配置
- 支持 100人瞬间爆发、每人7票、不同投票速度模拟
- 添加随机延迟函数模拟真实用户行为
- 强制 WebSocket 传输避免 HTTP 连接限制

前端修复:
- 修复 PostcardItem、PostcardDisplay 奖项名称硬编码问题
- 组件现在从后端 awards 配置动态获取奖项名称
- 修复 LiveVotingView、AdminControl 传递 awards 数据
- 新增 gala 压测命令到 package.json

测试验证:
- 100人并发压测通过,成功率 100%
- P95 延迟 0.7ms,远低于 500ms 阈值
- 系统可稳定支持 3.3 倍现场负载
2026-01-29 00:09:03 +08:00
..

年会互动大屏系统 - 压力测试指南

快速开始

1. 安装依赖

cd packages/server
pnpm add -D artillery @artilleryio/engine-socketio-v3

2. 确保服务运行

# 根目录启动所有服务
pnpm dev

# 或仅启动服务端
pnpm dev:server

3. 运行压测

# 冒烟测试 (快速验证)
pnpm test:load:smoke

# 标准测试
pnpm test:load

# 重压模式 (200并发对应需求规格书验收标准)
pnpm test:load:heavy

# 脉冲测试 (模拟现场投票热潮)
pnpm test:load:pulse

测试模式说明

模式 命令 并发量 持续时间 用途
smoke pnpm test:load:smoke 5 5s 快速验证配置
standard pnpm test:load 50 20s 日常开发测试
heavy pnpm test:load:heavy 200 35s 验收标准 (150人并发)
pulse pnpm test:load:pulse 150-200 21s 模拟现场脉冲式投票

验收标准

根据 年会互动大屏系统需求规格说明书.md

指标 目标值 检查方式
并发连接 200+ Artillery 报告 vusers.session_length
QPS > 1000 报告 socketio.emit_rate
延迟 P95 < 500ms 报告 socketio.response_time.p95
错误率 < 1% 报告 vusers.failed / vusers.completed
Redis 计数 准确无丢票 对比 Redis 统计与预期投票数

报告输出

测试完成后会输出类似以下报告:

All VUs finished. Total time: 35 seconds

--------------------------------
Summary report @ 16:30:00(+0800)
--------------------------------

socketio.emit: ..................... 5000
socketio.emit_rate: ................ 142.86/sec
socketio.response_time:
  min: ............................. 12
  max: ............................. 456
  median: .......................... 48
  p95: ............................. 189
  p99: ............................. 312

vusers.completed: .................. 200
vusers.created: .................... 200
vusers.created_by_name.完整投票流程: 140
vusers.created_by_name.快速连投压力: 40
vusers.created_by_name.观望用户: .... 20
vusers.failed: ..................... 0
vusers.session_length:
  min: ............................. 2500
  max: ............................. 6800
  median: .......................... 3400
  p95: ............................. 5200
  p99: ............................. 6100

高级用法

生成 HTML 报告

npx artillery run packages/server/load-test/vote-load-test.yaml \
  --output report.json && \
  npx artillery report report.json

指定环境运行

npx artillery run packages/server/load-test/vote-load-test.yaml -e heavy

调试模式 (查看详细日志)

DEBUG=socketio:* npx artillery run packages/server/load-test/vote-load-test.yaml -e smoke

故障排查

1. 连接失败

  • 检查服务端是否运行在 localhost:3000
  • 确认 CORS 配置允许本地访问

2. 投票被拒绝 (VOTING_CLOSED)

  • 确保导播台已开启投票通道
  • 或临时修改服务端绕过投票状态检查

3. 性能不达标

  • 检查 Redis 连接是否正常
  • 确认未在调试模式运行
  • 考虑增加 Node.js 内存限制: NODE_OPTIONS="--max-old-space-size=4096"