第 9 章
性能与容量
其他容量参考:单场班级人数 50–60 人无压力;账号量级测试至 525 账号、3,250 条作答明细;导入批次按 200 行分块提交,万行级名单导入通常在秒级完成。
本页目录
9.1 性能设计要点
| 设计点 | 说明 |
|---|---|
| 端点并发模型 | 纯同步数据库/磁盘操作的路由一律声明为同步 def,由 FastAPI 自动放入线程池执行,不阻塞事件循环;避免"导出题库/整库自检时全站卡死" |
| 静态资源 | 全站静态资源带 gzip 与 max-age=86400 长缓存,URL 附带 ?v=静态版本号(取 static 目录最新修改时间),改文件重启即自动击穿旧缓存 |
| 前端重型组件懒加载 | 富文本编辑器(约 1.3MB)、Excel 判分引擎(约 2.6MB)、Pyodide、CodeMirror 均按需加载 |
| 轮询自适应 | 页面不可见(document.hidden)时暂停轮询,回到前台立即补刷;极低配设备可放宽刷新间隔 |
| 服务端分页 | 题库列表等长列表接口在大数据量下走服务端分页,前端只渲染可视范围 |
| 索引支撑 | 场次排行榜 idx_su_sess_score(session_id, score)、作答明细 idx_att_*、题目 idx_qbq_* 等索引支撑高频查询 |
| 数据库调优 | WAL 日志模式 + synchronous=NORMAL + temp_store=MEMORY + cache_size=4MB + mmap_size=64MB + busy_timeout=30s |
9.2 容量建议(单机 / 局域网 / SQLite)
| 题量规模 | 体验 | 说明 |
|---|---|---|
| ≤1,000 题 | 无压力 | 当前真实库约 917 题 |
| 1 万 ~ 2 万题 | 仍流畅 | 全量类接口(导出包、全选 ID)响应上百毫秒 |
| ≥5 万题 | 全量类操作到秒级 | 建议避开上课时段做整库级操作 |
其他容量参考:单场班级人数 50–60 人无压力;账号量级测试至 525 账号、3,250 条作答明细;导入批次按 200 行分块提交,万行级名单导入通常在秒级完成。
9.3 关键参数表
实时答题
| 参数 | 值 |
|---|---|
每题分值 SCORE_PER_QUESTION |
10 分 |
抢答答错扣分 WRONG_PENALTY |
5 分 |
抢答作答窗口 BUZZ_ANSWER_SEC |
10 秒 |
在线判定窗口 ONLINE_SECONDS |
30 秒 |
切走(away)失联兜底 AWAY_STALE_SEC |
120 秒 |
心跳写库节流 HB_WRITE_SEC |
10 秒 |
| 每题限时默认 | 0(不限时),由主持台设置 |
限流与安全
| 参数 | 值 |
|---|---|
账号连续失败锁定 LOCK_FAILS / LOCK_SECS |
5 次 / 300 秒 |
IP 维度失败上限 IP_MAX_FAILS / 窗口 IP_WINDOW_SECS |
20 次 / 300 秒 |
IP 追踪表上限 IP_MAX_TRACKED |
2,000 条 |
单账号同时在线会话 MAX_SESSIONS |
10 |
会话有效期 SESSION_DAYS |
30 天 |
| 会话 Cookie 名 | qt(HttpOnly、SameSite=lax) |
| 初始口令清单可下载时长 | 30 天 |
| 学校入驻申请限流 | 5 次 / 窗口 |
上传与内容限制
| 项目 | 上限 |
|---|---|
| 请求体大小(按前缀) | /api/qbank/import_pack 512MB;/api/import/* 128MB;/api/excel/* 64MB;/api/qbank/* 32MB;其它 /api/* 16MB |
| 题干图片 | 5MB(png/jpg/jpeg/gif/webp) |
| 题库包解压保护 | 最多 5,000 个成员、累计 500MB |
| 表格题模板 / 考点 JSON / 判分脚本 / 学生作答 | 20MB / 5MB / 2MB / 20MB |
| 表格题明细入库 | detail 200KB、subs 64KB |
| 编程题用例数 | ≤50 组;超时 1–60 秒 |
| 编程题沙箱 | 2,000,000 步 / 5.0 秒 / 100,000 字符输出 |
分页与批量
| 项目 | 值 |
|---|---|
| 题库列表 limit 强制上限 | 1,000 |
| 记录/统计列表 limit 上限 | 100 |
| 分组批量查询 | 每 300 / 400 条一批 |
| 导入提交批次 | 每 200 行一个子检查点 |
日志与进程
| 项目 | 值 |
|---|---|
| 日志轮转 | 单文件 2MB,保留 5 份 |
| 端口策略 | 固定端口、绝不顺延、单实例 |
| 单实例检测 | GET /api/svc/ping(app="quiz-lan") |