← 返回题库
第 016 题 · 推理与部署 · 简单

流式生成如何处理背压、断连和请求取消?

岗位专项 这代表什么?
✓ 资料核验 来源说明:公开面经题库主题;公司归属未独立核验,技术答案依据原论文或官方文档整理
流式输出背压SSE
评论与补充 ↓
口述训练

先用自己的话答,再看参考说法

60 秒是练习上限,不是必须凑满。原理题讲清因果,设计题讲清约束,项目题只讲真实证据。

别照着背。参考说法只用于对照;直接回答问题,简单题说清楚就收尾。项目题只用自己的经历和数字。

面试时怎么答

从生产者和消费者速度不一致切入:模型持续产出 Token,客户端、网关或网络可能读得更慢,所以中间必须有有界缓冲和流控,不能无限堆内存。SSE、WebSocket 只是传输形式,不会自动解决背压。

追问断连时,回答取消信号要一直传播到调度器,尽快停止 Decode 并释放 KV Cache;还要处理半开连接、超时、重复结束事件和指标结算。

可以这样答:

流式生成应把模型输出写入有界队列,由发送端按客户端消费速度读取。队列接近上限时要暂停调度、降低发送批次或取消请求,不能无限缓存。客户端断连或超时后,取消信号应穿过网关和服务层到推理引擎,停止后续 Decode 并释放 KV Cache。实现还要保证结束事件幂等,并监控缓冲深度、慢消费者比例、取消延迟和取消后浪费的 Token。

核心回答

流式链路通常是推理引擎产生 Token,应用层编码事件,网关通过 SSE 或 WebSocket 发给客户端。每一层都要有有界缓冲和取消信号:客户端消费变慢时,不能无限堆积 Token;断连时要尽快把取消传播到调度器,停止后续 Decode 并回收 KV Cache。

SSE 适合服务端单向文本事件,浏览器支持自动重连;WebSocket 适合双向低延迟交互。无论采用哪种协议,都要定义心跳、完成/错误事件、UTF-8 增量解码、代理缓冲策略和“已经生成但尚未送达”的计费口径。

展开说明

  • 背压:为每连接设置字节/事件上限和写超时;达到阈值后可暂停读取引擎结果、降低调度优先级或取消请求。
  • 断连:网络关闭不等于 GPU 工作自动停止,应用必须显式调用引擎取消接口;取消通常是协作式的,可能要等当前迭代结束。
  • 重连:SSE 的 Last-Event-ID 能帮助恢复事件,但若服务端没有持久事件日志,就不能承诺无缝补发。
  • 边界完整性:Token 字节未必构成完整 Unicode 字符,客户端应使用增量解码而不是逐 Token 盲目拼接。

版本边界:WHATWG 定义了 SSE 传输语义,但不定义反向代理缓存、云负载均衡超时或 GPU 取消;这些行为取决于服务器、网关和推理引擎版本,必须端到端验证。

工程实践

为连接记录首事件延迟、事件间隔、待发送缓冲、写阻塞时间、断连后取消延迟和浪费的输出 Token。测试慢客户端、移动网络切换、代理空闲超时、重复重连、客户端在完成事件前断开,以及取消和自然完成同时发生的竞态。

常见追问

  1. SSE 和 WebSocket 如何选择? 只有服务端持续推送文本时优先 SSE,协议简单且易穿过 HTTP 基础设施;需要客户端持续发消息、二进制或真正双向会话时选 WebSocket。
  2. 客户端断开后为什么 GPU 可能仍在生成? TCP/HTTP 连接状态不会自动传到推理调度器;应用层必须监听断连并调用取消接口,调度器再在安全迭代边界移除序列。
  3. 背压时能否无限缓存以免丢 Token? 不能,无界缓存会把一个慢客户端变成内存故障。应设置上限和超时,并在产品语义上选择暂停、截断、持久化或取消。

一句话复习

流式生成必须让有界背压和取消信号贯穿客户端、网关、应用与 GPU 调度器,断开连接不等于停止推理。

参考资料

无需账号 · 原地交流

评论与补充

评论会直接显示在这道题下面。可以写自己的答法、继续追问或指出错误,不需要 GitHub 账号,也不会跳转到 Issue;内容会公开,请勿填写个人隐私、公司机密或受保密约束的材料。

正在加载评论…