27届大模型面试准备(七十二):大模型流式推理服务与长连接工程——SSE、背压与首包优化

发布时间:2026/9/2 1:35:03

27届大模型面试准备(七十二):大模型流式推理服务与长连接工程——SSE、背压与首包优化
27届大模型面试准备七十二大模型流式推理服务与长连接工程——SSE、背压与首包优化引言前面几篇把怎么把请求调度到卡上、怎么把卡喂满讲透了。本篇聊用户真正感知到的那一端流式输出打字机效果。用户问一个问题前端要能在 200ms 内看到第一个字然后稳定地一个 token 一个 token 蹦出来断网还能续上。这背后是 SSE/WebSocket 长连接、服务端背压、首包TTFT优化、断点续传一整套工程。也是华为云大模型 API 岗、对话产品后端岗必问。前文链接A71 多租户 GPU 虚拟化与推理隔离、A70 推理服务负载均衡与智能请求路由、A61 服务可观测性与延迟吞吐剖析。Browser/App 网关(LB) 推理服务(vLLM/TGI) GPU │ │ │ │ │── GET /v1/chat ──▶ │ │ │ │ (SSE, stream) │── forward ───────────▶ │ prefill │ │ │ │───────▶ │ │◀── data: {照) ──│◀── token#1 ────────────│◀────── │ │◀── data: {片) ──│◀── token#2 ────────────│ decode 流式 │ │ ... │ ... │ (逐 token 回传) │ │◀── data: [DONE] ──│◀── 结束 ───────────────│ │ │ │ │ │ SSE 长连接全程保持服务端按生成节奏 push客户端按渲染节奏消费表流式协议选型协议方向自动重连实现复杂度适用SSE (text/event-stream)服务端→客户端单向浏览器原生 EventSource低对话流式输出首选WebSocket双向需自实现中需客户端上行语音/打断普通 HTTP 客户端轮询双向轮询无低但体验差不支持 SSE 的古老环境一、SSE 长连接的最小实现SSE 本质是Content-Type: text/event-stream的分块 HTTP 响应服务端用flush把每个 token 立即推给客户端而不是等全部生成完才返回。# FastAPI 流式端点SSEfromfastapiimportFastAPI,Requestfromfastapi.responsesimportStreamingResponseimportasyncio,jsonappFastAPI()asyncdeftoken_stream(prompt:str):# 假设 engine.generate_async 是异步逐 token 生成器asyncforpieceinengine.generate_async(prompt,streamTrue):# SSE 格式以 data: 开头两个换行结尾yieldfdata:{json.dumps({content:piece},ensure_asciiFalse)}\n\nawaitasyncio.sleep(0)# 让出事件循环避免阻塞其他连接yielddata: [DONE]\n\napp.post(/v1/chat/stream)asyncdefchat(req:Request):bodyawaitreq.json()returnStreamingResponse(token_stream(body[prompt]),media_typetext/event-stream,headers{Cache-Control:no-cache,X-Accel-Buffering:no},)关键头X-Accel-Buffering: no关掉 Nginx 缓冲否则 SSE 会被攒批Cache-Control: no-cache防止中间代理缓存。二、服务端背压生成快于消费怎么办GPU 生成 token 的速度可能 100 tok/s常快于客户端网络/渲染速度。如果服务端无脑猛推内存里会堆满未发送的 chunk连接一多就 OOM。正确做法是背压客户端消费慢时服务端生成器被卡住。importasyncioasyncdefbackpressure_stream(raw_gen,client_queue_max128):qasyncio.Queue(maxsizeclient_queue_max)# 有界队列即天然背压asyncdefproducer():asyncfortokinraw_gen:awaitq.put(tok)# 队列满则 producer 自动挂起awaitq.put(None)# 结束哨兵asyncdefconsumer():asyncio.create_task(producer())whileTrue:tokawaitq.get()iftokisNone:yielddata: [DONE]\n\n;breakyieldfdata:{json.dumps({content:tok},ensure_asciiFalse)}\n\nasyncforchunkinconsumer():yieldchunk当q满producer的await q.put挂起推理引擎的generate_async也跟着停自然把压力传导回调度层连续批处理里该请求暂时不取新 token。这就是背压链客户端慢 → 队列满 → 引擎暂停 → GPU 让给其他请求。三、首包优化TTFT用户最在意的是多久出第一个字。TTFT 路由耗时 排队 Prefill 耗时 首 token 网络传输。优化点预取/预热长连接复用避免每次握手建连。优先级队列流式对话请求进高优队列减少排队。Prefix Cache系统提示词命中前缀缓存Prefill 直接复用 KV省掉重复计算。分块 Prefill超大上下文时把 Prefill 切成多块穿插 decode避免单次卡死。# 网关层首包计时观测 TTFT 分布importtimeapp.middleware(http)asyncdefmeasure_ttft(request,call_next):starttime.perf_counter()responseawaitcall_next(request)# 用 response 的流式回调记录首个 chunk 到达时刻request.state.ttft_startstartreturnresponse# 在 token_stream 第一个 yield 时打点ttft now - request.state.ttft_start四、断线续传与去重弱网环境下 SSE 可能中途断开。浏览器EventSource会自动重连但重连会重新发请求、从头生成浪费且重复。生产做法服务端给每条流式会话发stream_id客户端重连带Last-Event-ID。网关按stream_id缓存最近 N 个已发 token重连后从断点续推不重新进模型。客户端做幂等同一stream_id的data按序号去重拼接。# 断点续传网关缓存已发事件classStreamResumer:def__init__(self):self.sent{}# stream_id - list[(seq, payload)]defon_send(self,sid,seq,payload):self.sent.setdefault(sid,[]).append((seq,payload))defresume_from(self,sid,last_seq):# 只补发 last_seq 之后的事件return[(s,p)fors,pinself.sent.get(sid,[])ifslast_seq]五、长连接资源治理每个 SSE 连接占一个 worker 协程 一个网关连接。万人同时对话连接数爆炸。治理连接数上限 空闲超时无 token 超过 N 秒断连。网关层用支持长连接的反向代理如 Envoy而非短连接为主的 Nginx 默认配置。多实例下流式会话要粘性同一 stream 落到同一后端否则续传缓存失效。面试速答问SSE 和 WebSocket 怎么选答纯服务端推对话输出用 SSE浏览器原生 EventSource 自动重连、实现简单需要客户端上行语音打断、实时控制才上 WebSocket。问服务端生成比客户端消费快怎么不 OOM答有界队列做背压队列满时推理生成器挂起压力传导回引擎和调度层让 GPU 服务其他请求而不是在内存堆 chunk。问断网重连为什么会重复输出怎么解答EventSource 重连会重新请求从头生成。解法服务端发 stream_id 序号重连带 Last-Event-ID网关从断点续推客户端按序号去重。高频追问清单Nginx 默认会缓冲 SSE 吗哪个响应头能关掉背压链断在哪一层最危险网关/引擎/客户端流式会话在多副本部署下怎么做粘性路由和续传缓存TTFT 的构成拆解哪一段最难优化、为什么Prefix Cache 对首包优化的收益上限受什么限制万人长连接下网关连接数和后端 worker 怎么配比客户端怎么区分模型真的说完了和网络断了流式输出如何保证 token 顺序不乱并发 decode 多候选

相关新闻

27届大模型面试准备(七十一):多租户 GPU 虚拟化与推理隔离工程——MIG、MPS 与噪声邻居治理

27届大模型面试准备(七十一):多租户 GPU 虚拟化与推理隔离工程——MIG、MPS 与噪声邻居治理

2026/9/2 1:35:03

27届大模型面试准备(七十一):多租户 GPU 虚拟化与推理隔离工程——MIG、MPS 与噪声邻居治理 引言 上篇(六十九)讲 Prefill-Decode 分离,把单卡算力按阶段拆开调度;(七十)…

MCP规范驱动的Agent智能体评测自动合成方法与实践

MCP规范驱动的Agent智能体评测自动合成方法与实践

2026/9/2 1:35:03

做 Agent 相关开发的读者可能最近都有同感:Agent 用起来越来越顺手,但评测一个 Agent 到底好不好用,却越来越难。难点不在跑通一个 Demo,而在“怎么证明它在真实任务上可靠”。工具调用是否准确、多步推理是否稳定、边界情况是否崩…

用Python爬取DigiKey元器件价格库存:从BOM清单到CSV的自动化方案

用Python爬取DigiKey元器件价格库存:从BOM清单到CSV的自动化方案

2026/9/2 1:35:03

简介:digikey_webscraper 是一个基于 Python 的 Web Scraping 工具,面向电子工程师与采购人员,用于从 Digi-Key Electronics 自动提取元件价格、库存与属性等元数据,能够替代人工逐页查询,提升批量数据采集效率。压缩包…

开源效率启动器Tinycast:从入门到插件开发实战

开源效率启动器Tinycast:从入门到插件开发实战

2026/9/2 4:05:22

你好,我是专注于分享实用开发工具与效率提升方案的博主。在日常开发中,你是否也厌倦了在多个应用、文件夹和网页间频繁切换鼠标,只为找到一个文件或执行一个简单命令?如果你对 macOS 上广受好评的效率启动器 Raycast 心生向往&…

自制简便型2.4G频谱仪:从射频前端到FFT频谱显示实战

自制简便型2.4G频谱仪:从射频前端到FFT频谱显示实战

2026/9/2 4:05:22

简介:这是一份面向航模玩家与嵌入式开发者的简便型2.4G频谱仪开源资料,基于Arduino与CC2500射频芯片实现,用于实时监测2.4G频段信号分布、排查遥控干扰,并辅助飞行前场地检测。资源共10个文件,以ino源码(含…

OrCAD Capture 16.6精简免安装版:原理、配置与实战指南

OrCAD Capture 16.6精简免安装版:原理、配置与实战指南

2026/9/2 4:05:22

简介:OrCAD Capture 16.6 精简免安装版,面向硬件设计工程师与电子类学生,尤其适合需要快速搭建原理图设计环境、进行电路仿真,或作为备用EDA工作环境的场景。它无需执行完整安装,直接解压即可部署,减小系统…

ESP32 I2S驱动功放全流程:从接线到无声排查

ESP32 I2S驱动功放全流程:从接线到无声排查

2026/9/2 4:05:22

每次有朋友问我,ESP32 怎么把音频放出来,我第一句话都是:先别急着写 i2s 初始化,先搞清楚你的功放到底能不能吃 i2s 信号。在 ESP-IDF 开发里,用 i2s 驱动功放,听起来只是几根线的问题,实际落地…

Vibe Coding实战:AI辅助插件开发全流程指南

Vibe Coding实战:AI辅助插件开发全流程指南

2026/9/2 4:05:22

这次我们来看一个名为“我也来用vibe coding做个插件”的项目。从标题和当前的热词趋势来看,这显然是一个关于利用“Vibe Coding”理念或工具来开发自定义插件的实践分享。Vibe Coding 并非一个具体的软件,而更像是一种开发理念或工作流,强调…

芯邦CBM209X U盘量产工具UMPToolV7200:从救砖到扩容盘识别

芯邦CBM209X U盘量产工具UMPToolV7200:从救砖到扩容盘识别

2026/9/2 3:55:21

简介:芯邦CBM209X UMPToolV7200量产工具套装面向需要修复扩容盘、缩水盘的玩家、维修人员与数码爱好者,支持CBM209X/E等常见主控,内含ChipGenius识别工具、APTool量产信息清除工具以及UMPTool主量产工具,能完成从主控识别、伪容量…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/1 1:53:39

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/1 9:55:14

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

单片机毕业设计-基于单片机与蓝牙通讯的输液状态监测终端设计与开发 基于 STM32 或 51 单片机的液位‑滴速‑温度多参数输液监护装置设计(024005)

2026/9/2 0:04:59

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

DeepSeek字幕翻译实战:从API调用到批量SRT转中文的完整方案

2026/9/2 0:04:59

这次我们来看一个很实用的 DeepSeek 落地场景:用 DeepSeek 把英文视频字幕自动翻译成中文。具体案例是《恶魔君》1989 年第 28 集的英转中字幕任务,标题写得很直白,但背后其实是一整套可以复用的技术流程:字幕解析、模型调用、批量…

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

用Python搭建搞笑语音助手:从语音识别到语音合成全教程

2026/9/2 0:04:59

当你家里摆着一台天猫精灵,却总希望语音助手偶尔“不正经”一点,不用官方腔回答问题,而是张口就接几句搞笑段子,会是什么体验?我最近动手验证了一下这个想法——没有去改装任何市面上现有的智能音箱,而是直…

远程协作的工作台整理

远程协作的工作台整理

2026/9/1 0:03:36

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/1 0:03:36

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/2 2:45:06

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…