perf(worker-platform): 排行榜公共缓存与抢单短路,压制 8.5s 慢查询脉冲

- 排行榜:Top 10 改为按 period 全局共享缓存(TTL 30s),SQL 传 currentWorkerId=0;
  个人单数解耦为 assigned_worker_id 精准索引查询(TTL 15s),未上榜展示「暂未上榜」,
  消除「每个打手一份缓存」导致的 8.5 秒全表聚合穿透;
- 抢单短路:新增 work-order-grab-guard,对已关闭工单打 10s 进程内标记,命中直接 409;
  publishWorkOrderRealtimeChange 统一作废标记,避免撤单/超时重开/重新发布后误杀正常抢单;
- 我的订单:默认排序也走「先取 id 再批量回表」的延迟分页,避免宽列 material_json 参与排序;
- 文档:新增生产 CPU 波动分析报告,慢查询数字按 6,235 行日志实测重算,并标注修复状态与验收口径。

验证:typecheck / check:sql / eslint / prettier 通过;后端 npm test 914 项(910 pass、4 skip、0 fail)。
This commit is contained in:
yml2213
2026-10-30 22:42:11 +08:00
parent 4ef52f11ba
commit 44791a9c8b
9 changed files with 421 additions and 25 deletions
@@ -38,6 +38,7 @@ import {
resolveWorkerPermissions,
stripWorkerPersonalShareFields,
} from '../worker-platform/mappers.js'
import { evictWorkOrderGrabBlock } from '../worker-platform/work-order-grab-guard.js'
import { invalidateWorkerMyOrderCaches } from '../worker-platform/worker-my-order-cache.js'
export type RealtimeEventType =
@@ -188,6 +189,9 @@ export function publishWorkOrderRealtimeChange(input: {
hallChanged?: boolean
}) {
const workOrderId = Math.max(0, Number(input.workOrderId) || 0)
// 工单状态变更(撤单 / 超时重开 / 重新发布)会复用同一个工单 id,
// 必须立刻作废抢单短路标记,否则正常打手会在 TTL 内被误判 409。
evictWorkOrderGrabBlock(workOrderId)
void publishWorkOrderSnapshots({ ...input, workOrderId }).catch(() => {
publishRealtimeEvent({
type: 'work_order.changed',