Commit Graph
11 Commits
Author SHA1 Message Date
yml2213 69e3d9a396 perf(worker): 「我的订单」缓存改为事件驱动失效,TTL 2s/5s → 30s
这是当前最大瓶颈的根治:打手端三件套(列表/计数/概览)占全库约 75% 缓冲读,
单查询成本是 O(打手单量) 的固有成本(重打手 8,586 单逐行探测),
索引层面已无可抠,只能把"计算次数"和"访问次数"解耦。

原先 TTL 只有 2s/5s,是因为文档担心"再长会让分页总数滞后"。
但该数据只在该打手自己的工单流转时才变,而项目已有 realtime 快照广播
精确感知每次流转——把同一事件流接到缓存失效上,长 TTL 与新鲜度可以兼得,
正确性反而优于固定 5s(那同样存在滞后窗口)。

- WorkerListCache 新增 evictByPrefix:按键前缀整体逐出;
- 缓存实例抽到中立模块 worker-my-order-cache.ts:realtime 需要引用失效入口,
  而 my-order-service 已 import realtime,实例放任何一方都会循环依赖;
- 缓存键统一为 ["w",workerId,scope,detail],前缀失效不会误伤其它打手;
- 失效挂在 publishWorkOrderSnapshots:那里恰好已有工单 + 全部拼单人,
  受影响集合取 当前指派 + 历史保留 + 全部拼单人 + 调用方指定,
  21 处工单写入路径(含取消申请/反馈处理)都会经过;
  工单已删除的分支同样失效,避免打手继续看到已删的单。

最坏情况(漏失效)是打手最多 30s 看到旧状态,与原 5s TTL 的滞后窗口同性质。
守卫测试锁定:失效入口存在、键前缀格式、受影响集合三要素齐全。
2026-10-03 15:23:11 +08:00
yml2213 142c4ee141 perf(realtime): 一次广播只序列化一次,不再按订阅者重复 stringify
抓包发现单个后台客户端 5 秒收到 981,776 字节 / 336 条事件(约 196KB/s、67 条/秒、
每条平均 2680 字节,最大 6418 字节)。事件构成:work_order.changed 34 条/秒、
order.changed 23 条/秒、admin_notification.changed 7.6 条/秒。

原广播实现在订阅者循环里逐个 `JSON.stringify(payload)` 并重建 SSE 模板串:
客户端越多,同一份载荷就被序列化越多次(后台/打手端都在线时更明显)。
改成先 `buildEventFrame()` 构造一次,循环里只写同一帧:

- broadcast() 只调用一次 buildEventFrame
- writeEvent()(ready 事件与断线补发)复用同一构造函数
- 行为不变,仅去掉重复序列化

受众过滤经核对本来就是正确的(admin 事件只发后台、worker 事件按 workerIds 过滤),
realtime_events 也有自我清理(每 100 条保留最近 500 条,实测 555 行/2MB),
故本次只动序列化这一处。

验证:后端 548 项单测全绿(新增 1 项守卫,禁止 broadcast 内再出现 JSON.stringify)。
2026-10-01 15:46:43 +08:00
yml2213 7e1c879c41 修复新订单广播绕过等级可见延迟导致抢单提示不可拼单 2026-08-22 18:56:00 +08:00
yml2213 ed81122047 大厅与后台工单列表改为精确补丁并支持抢单确认 2026-08-22 09:30:38 +08:00
yml2213 874b093a4b 新增大厅订单容量控制 2026-08-21 14:02:30 +08:00
yml2213 f1575aec85 修复拼单工单打手展示 2026-08-19 19:31:55 +08:00
yml2213 ab6387759e 修复拼单明细并支持参与者撤单 2026-08-19 14:35:23 +08:00
yml2213 ee79195f47 完善拼单状态与份额验收流程 2026-08-18 18:02:43 +08:00
yml2213 370acdba60 增加工单首次查看标识 2026-08-17 20:11:35 +08:00
yml2213 2aa8769661 改造实时事件缓存同步 2026-08-17 17:32:02 +08:00
yml2213 18dad9b0fe 增加订单实时状态同步 2026-08-17 14:51:51 +08:00