并发与调度
🎯 学习目标
- 前端 AbortController 取消流式请求
- 服务端 Semaphore 限制并发防 429
- 长 Agent 任务改异步 Job + polling
引言
LLM 请求耗时长、成本高,不限并发会打爆 API 配额;用户离开页面应立刻 abort 上游。
章节正文
第 1 步:前端取消
javascript
const controller = new AbortController()
fetch("/api/chat", { method: "POST", body, signal: controller.signal })
// 用户点「停止」
controller.abort()服务端监听客户端断开,停止向上游 LLM 续写,节省 Token。
第 2 步:并发与队列
python
import asyncio
sem = asyncio.Semaphore(10) # 最多 10 路 LLM
async def handle_chat(req):
async with sem:
return await llm.ainvoke(req.messages)超限时返回 503 或进入 Redis 队列(Celery/BullMQ),实现背压。
第 3 步:长任务模式
Agent 跑 5 分钟不适合挂 HTTP:
- POST /jobs → job_id
- 后台 worker 执行,Checkpoint 写 DB
- GET /jobs/{id} polling 或 SSE 进度
- 前端展示「第 2/5 步:检索文档…」
动手练习
- 实现停止按钮 abort 流式 fetch
- 用 Semaphore(3) 压测第 4 个请求排队或 503
本节小结
Abort 省 Token;Semaphore/队列防限流;长 Agent 用 Job 异步化。