Skip to content

并发与调度

🎯 学习目标

  • 前端 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:

  1. POST /jobs → job_id
  2. 后台 worker 执行,Checkpoint 写 DB
  3. GET /jobs/{id} polling 或 SSE 进度
  4. 前端展示「第 2/5 步:检索文档…」

动手练习

  1. 实现停止按钮 abort 流式 fetch
  2. 用 Semaphore(3) 压测第 4 个请求排队或 503

本节小结

Abort 省 Token;Semaphore/队列防限流;长 Agent 用 Job 异步化。