面试知识库

BP5 · WebSocket 实时通信与异步任务管理#

定位:面试官追问实时通信与并发任务管理时的拷问预备。


核心口述(30 秒)#

“connect-first 协议零事件丢失:先连 WS 再 POST 任务。双池优先级队列:normal/heavy 分池,长任务堵不死短任务。事件回放:Redis Stream + last_event_id 补发。收尾流式:商品卡先出、文案逐字补。“


拷问链#

Q: 为什么 connect-first 而不是缓冲早期事件?#

缓冲需要知道”缓冲到什么时候为止”——WS 建连时间不确定。connect-first 协议层关死竞态。

Q: 为什么双池不是单池加优先级?#

单池长任务占满槽位,新的简单查询(2 步出结果)也要排队。双池保证 normal 不被 heavy 堵死。

Q: active_tasks 按 key 盲删的竞态怎么修?#

同 tid 快速重发,新任务 TaskHandle 被旧任务 finally 删。改按对象身份校验:if tasks.get(tid) is self_handle

Q: 事件回放保证不重复?#

每个事件有单调递增 event_id。断线重连带 last_event_id,只推 > 该 id 的事件。

Q: 冷启动续看怎么做?#

GET /api/task/{tid}/inflight 探口 → replay_current_run 按轮回放 → 前端 resumeIfRunning 自动重建。

Q: 收尾流式的 items_preview 和 summary_delta 什么关系?#

items_preview 是一次性推所有商品卡(结构化数据)。summary_delta 是逐 token 流式推文案。先出货后出文案。


压力题#

Q: 进程内 ConnectionManager 多副本怎么办?#

改 Redis Pub/Sub。当前单进程够用,有明确升级路径。