title: " AI排查队列积压 | Worker和死信" category: 人工智能 tags:
- 大模型API中转站
- 4SAPI
- AI排错
- 队列
- Worker
- Redis
- Agent工作流 description: "队列积压常见于 Worker 挂掉、消费速度低、任务重试风暴、死信队列无人处理、模型 API 慢和数据库写入慢。本文讲如何用 AI 分析队列指标、日志和 4SAPI 调用成本。"
很多 AI 工作流最后都会引入队列。
比如:
批量摘要。
文档入库。
RAG 重新索引。
模型评测。
Webhook 重试。
异步生成报告。
队列一旦积压,用户看到的是:
任务一直处理中。
报告迟迟不出。
系统越来越慢。
队列问题很适合 AI 排查。
因为它需要同时看:
生产速度。
消费速度。
Worker 状态。
失败重试。
死信队列。
模型 API 耗时。
数据库写入。
1. 队列积压先看四个数
入队速率。
出队速率。
失败率。
最老任务等待时间。
只看队列长度不够。
队列长度 1000 不一定危险。
如果消费很快,可能正常。
最危险的是:
队列长度持续上升。
最老任务越来越老。
失败重试越来越多。
2. 给 AI 的队列排错包
【现象】
- 哪个队列:
- 当前长度:
- 最老任务等待时间:
- 影响业务:
【指标】
- 入队速率:
- 出队速率:
- 失败率:
- 重试次数:
- dead letter 数量:
【Worker】
- worker 数量:
- worker 日志:
- CPU/内存:
- 最近重启:
【任务】
- top task_type:
- 单任务平均耗时:
- 是否调用模型:
- 是否写数据库:
【4SAPI】
- 模型耗时:
- 429/504:
- retry_count:
- cost:
【边界】
- 不清空队列
- 不删除死信
- 先给只读分析
3. 常见根因一:Worker 没在跑
最简单也最常见。
队列有任务,但 worker 进程挂了。
检查:
docker compose ps
docker compose logs --tail=200 worker
或者 systemd:
systemctl status worker --no-pager
AI 判断时要看:
worker 是否存在。
是否 crash loop。
是否连接不上 Redis。
是否读取不到环境变量。
4. 常见根因二:重试风暴
某类任务一直失败,又不断重试。
队列看起来很忙。
但都在重复失败。
常见原因:
模型 API 429。
数据库唯一约束冲突。
第三方接口失败。
输入数据格式错。
修复:
限制最大重试。
指数退避。
失败分类。
不可重试错误进死信。
不要无限重试。
5. 常见根因三:模型调用太慢
如果 worker 每个任务都调用 Fable 5,吞吐会很低。
解决方式:
简单任务用低成本模型。
批量任务用并发上限。
长任务拆分。
大任务异步化。
记录每个 task_type 的模型耗时。
4SAPI 日志可以告诉你:
队列慢是不是模型慢。
6. 常见根因四:死信没人看
死信队列不是垃圾桶。
它是事故线索。
AI 可以每天总结死信:
按错误类型分组。
按任务类型分组。
找重复失败。
给修复优先级。
但不要让 AI 直接重放死信。
重放可能再次打爆系统。
7. 短期止血和长期治理
队列积压时,AI 给方案要分两层。
短期止血:
暂停低优先级生产者。
增加 worker,但要看数据库和模型限流。
降低单任务并发。
把不可重试错误送入死信。
临时降级低价值任务。
长期治理:
任务按优先级拆队列。
批量任务和实时任务分 Key。
给每类任务设置最大重试。
记录处理耗时分布。
设置积压告警。
注意:
盲目加 worker 可能把数据库、Redis 或 4SAPI 限流打爆。
所以 Fable 5 做判断时要同时看:
worker 数。
数据库连接数。
模型 API 429。
队列任务类型。
8. 死信报告模板
每天可以让低成本模型生成死信报告:
死信总数:
Top 错误类型:
Top 任务类型:
最早失败时间:
是否同一用户/租户集中:
是否可安全重试:
需要人工处理:
Prompt:
请整理这批死信队列记录。
只做分类和摘要,不重放任务。
标注哪些错误看起来可重试,哪些属于数据错误或权限错误。
死信不是失败的终点。
它是系统改进的入口。
9. 优先级队列设计
如果所有任务都进同一个队列,迟早会出问题。
比如:
用户实时请求。
后台批量摘要。
RAG 重建索引。
每日报表。
失败重试任务。
全混在一起,结果就是:
一个低价值批量任务拖慢高价值实时任务。
建议拆:
realtime:用户等待结果的任务。
normal:普通后台任务。
batch:离线批量任务。
retry:失败重试任务。
dead_letter:需要人工处理任务。
如果任务会调用 4SAPI,还要按模型成本拆:
低成本模型批量队列。
Fable 5 高价值队列。
不要让批量任务随便占用 Fable 5 的额度。
10. Worker 扩容前的检查
很多人看到积压就加 worker。
但加 worker 前要问:
数据库连接数够吗?
Redis 扛得住吗?
4SAPI 是否会 429?
第三方 API 是否限流?
单任务是否本来就太慢?
Fable 5 可以帮你做扩容审查:
请审查这个队列扩容方案。
当前 worker 从 4 增加到 12。
请判断是否会打爆数据库连接池、4SAPI Key 限流或第三方 API。
给出更稳的扩容和限流方案。
很多时候,正确答案不是加 worker。
而是:
限制并发。
拆队列。
降级低价值任务。
修重试策略。
11. 队列告警不要只看长度
队列监控最容易犯的错,是只盯着:
queue_length
但一个队列长度 5000,可能很正常。
比如批量索引任务本来就会在凌晨堆起来,早上慢慢消费。
更好的告警是组合指标:
最老任务等待时间超过阈值。
出队速率连续下降。
失败率突然升高。
重试任务占比超过阈值。
死信连续增长。
4SAPI 429/504 同时升高。
我会把队列告警拆成三类:
| 告警 | 含义 | 处理方向 |
|---|---|---|
| backlog_age 高 | 用户等待变长 | 先看 worker 和单任务耗时 |
| retry_ratio 高 | 重试风暴 | 先分类错误,不要加 worker |
| dlq_growth 高 | 不可恢复失败变多 | 先整理死信,不要重放 |
如果是 AI 任务队列,还要加一类:
model_latency_p95
model_error_rate
model_cost_per_task
这三个指标由 4SAPI 提供最方便。
当队列积压时,让 Fable 5 看到这些指标,它会更容易判断:
是 worker 数量不够。
是模型供应商慢。
是任务设计太重。
还是重试策略把系统拖死了。
一个实用规则:
如果失败率高,不要先扩容。
如果模型 429 高,不要先扩容。
如果数据库连接池满,不要先扩容。
扩容只适合“任务健康,只是消费能力不足”的场景。
这也是为什么队列排查要把业务日志、Worker 日志和 4SAPI 日志放在一张图里看。
12. AI Prompt
你是队列积压排查助手。
请根据队列长度、入队/出队速率、失败率、Worker 状态、任务日志和 4SAPI 模型调用日志,判断积压原因属于:
1. Worker 未运行
2. Worker 数量不足
3. 单任务耗时变长
4. 模型 API 慢或限流
5. 数据库写入慢
6. 重试风暴
7. 死信未处理
要求:
- 不建议清空队列作为第一方案。
- 给只读验证步骤。
- 区分短期止血和长期治理。
13. 总结
队列积压不是一个数字。
要看:
入队。
出队。
失败。
重试。
Worker。
死信。
模型耗时。
4SAPI 能把模型调用耗时和成本接入排查链路。
Fable 5 适合判断复杂积压根因。
一句话:
队列积压不要先清空,先找是谁生产太快、谁消费太慢。