先确认是不是 Workers AI 本身慢
我会先把一次调用拆成四段看,而不是直接怪模型。
| 段落 | 需要记录 | 常见误判 |
|---|---|---|
| 客户端到 Worker | requestId、入口时间、用户 id | 浏览器超时被当成模型失败 |
| Worker 编排 | KV/D1/R2/fetch 每段耗时 | 数据读取慢被当成 AI 慢 |
| Workers AI 调用 | 模型名、输入大小、首包时间、错误类型 | 模型排队与参数错误混在一起 |
| fallback / 重试 | 第几次、退避时长、替代模型 | 重试成功但成本翻倍 |
先补日志。我的最小字段是 requestId、taskType、model、inputSize、attempt、durationMs、errorClass、fallbackModel。没有这些字段时,讨论「该不该换模型」通常是在猜。
Cloudflare 官方文档把 Workers AI 放在 Workers 生态里使用,适合边缘侧推理和应用编排;Cloudflare Queues 则适合把异步工作从用户请求里拆出去。这个限制很关键:不是所有 AI 任务都应该在一次 HTTP 请求里完成。
最短止血路径怎么走?
第一步,先给同步请求定一个硬限制。我的做法是:用户当前页面必须看到的结果才同步,例如一句标签分类、一段短摘要、一个轻量 embedding。长报告、批量改写、批量图片描述,一律只返回任务 id。
第二步,给 Workers AI 调用加业务级超时。不要让 Worker 无限等模型。超过你设定的时间后,返回结构化状态:queued、retryable 或 failed,而不是让前端拿到一个模糊的 500。
第三步,把重试从「立即再来一次」改成退避。第一次失败后等 1-2 秒,第二次等 4-8 秒,并带上同一个幂等键。没有幂等键的重试最危险:用户刷新一次,你可能创建两份任务、扣两次额度、写两条结果。
第四步,立刻关掉无脑 fallback。很多独立开发者会把「A 模型失败就换 B 模型」写得很顺手,但没有成本表。fallback 应该是配置项:哪些任务允许、最多几次、替代模型是谁、单次预算多少。
什么时候必须上队列?
我用三个判断条件。
- 单次输入不可控:用户上传文本、CSV、网页内容,长度由用户决定。
- 结果可以晚一点拿:摘要报告、批量标签、后台质检,不影响当前付款或登录。
- 需要多步编排:先抽取、再分类、再生成、再写库,中间任何一步失败都要恢复。
满足两个条件,我就放进 Cloudflare Queues。前端拿到 jobId 后轮询 /api/jobs/:id,状态只给五个:received、queued、running、succeeded、failed。不要发明十几个状态,客服和用户都记不住。
队列消费者里再调用 Workers AI,并把每一次 attempt 写进日志或数据库。失败时只让 worker 自己重试,不让浏览器刷新触发新任务。
重试策略应该怎么写?
我的规则很保守:
| 错误 | 是否重试 | 原因 |
|---|---|---|
| 网络中断、临时 5xx | 可以 | 可能是短时波动 |
| 429 或容量不足 | 可以,但退避更长 | 立即重试通常更差 |
| 400、参数错误 | 不重试 | 输入不改,结果不会变 |
| 401/403 | 不重试 | 密钥或权限问题 |
| 输出过长、输入过大 | 不重试,改任务 | 需要切片或换流程 |
重试次数我一般设 2 次。超过以后进入失败队列,给后台一个「人工重跑」按钮。自动系统要有刹车,不然凌晨某个上游波动,会把所有失败任务排成第二天的成本账单。
fallback 成本怎么算才不失控?
把任务分级,不要按模型分级。
| 任务 | 默认模型 | fallback | 成本策略 |
|---|---|---|---|
| 标签分类 | 轻量模型 | 同级模型 | 允许自动 fallback |
| 客服草稿 | 中等模型 | 更强模型 | 只对付费用户开启 |
| 长报告 | 队列任务 | 人工重跑或异步强模型 | 需要预算上限 |
| 批量处理 | 队列 + 分片 | 降级输出 | 禁止无限 fallback |
每个 job 存一个 estimatedCost 和 actualCost,哪怕一开始只是估算也比没有强。等你看到某类任务的 fallback 率超过 10%,不要急着加预算,看是不是输入过长、prompt 太散、模型选择不对。
如果你的 AI SaaS 既要接 OpenAI 又要接 Claude,模型切换和账单口径会更复杂。我一般会把高成本路径接到稳定调用 Claude / OpenAI 的中转服务,至少让多模型调用、余额和失败重跑在同一套记录里,不要散在三四个后台。
还没恢复时,单独查 Workers AI retry
做降级,不要硬扛。
- 关闭批量入口,只保留单条处理。
- 把长任务全部改为异步,前端只显示任务状态。
- 临时降低 fallback 等级,不让轻任务跳到高成本模型。
- 给免费用户加每日队列上限,付费用户保留优先级。
- 导出最近 24 小时失败任务,按错误类型排序,而不是按用户投诉排序。
如果这五步之后还是慢,再考虑换模型、换地区或拆服务。很多时候真正的问题不是 Workers AI,而是你把同步产品体验、异步任务、成本控制写在了一段函数里。
相关阅读
- Cloudflare Workers API 超时排查:Worker 调用上游 API 的通用超时处理
- Supabase Edge Function LLM 超时:在 Supabase 跑 AI 推理的超时对比
- LLM fallback router 实现:多模型 fallback 的路由实现,防止降级成本失控