INC-2025-0412

任务同步 502 错误飙升

SEV-2 已解决 持续时间 47 分钟 发现时间 4 月 12 日 · 14:07 负责人 Devon Park
摘要

一次配置发布把 sync-worker 这一档的数据库连接池上限 从 64 降到了 8,在下午常规负载下连接被打满。同步 API 在 47 分钟内 约有 21% 的请求返回 502。我们通过回滚配置并轮替 worker 集群完成缓解; 没有数据丢失。

时间线


14:02
配置变更 cfg-9a12 通过标准发布流水线 推到生产环境。
14:06
影响开始。Sync worker 在连接池获取上开始排队; P95 延迟攀升超过 4 秒,负载均衡器开始返回 502。
14:07
告警触发:sync_5xx_rate > 2% 持续 60 秒。 On-call (Devon) 确认接手。
14:18
初步怀疑是 API 服务发布出了问题;回滚了最近两次应用发布, 没有效果。
14:31
Mira 加入排查,注意到 worker 看板上连接池等待已经打满。 排查方向从应用代码转向基础设施配置。
14:44
已缓解。cfg-9a12 已回滚;worker 集群已轮替。三分钟内 5xx 率降到 0.2% 以下。
14:49
监控连续 5 分钟保持绿色。事故宣告解决;状态页已更新。

根因


PR #4888 让连接池上限可以按 worker 等级 独立配置。新增的 sync-worker 键本应继承 全局值(64),但在一次本地调试时被硬编码成 8 并提交了。配置 linter 只校验类型不校验数值范围,所以这次变更顺利过了 CI。

由于配置发布和代码发布走的是两条不同的流水线,on-call 第一反应 — 回滚最近两次应用发布 — 没起作用,白白消耗了大约 13 分钟诊断时间。

infra/config/workers.yaml
pool:
global_max_connections: 64
tiers:
- sync-worker: { max_connections: 64 }
+ sync-worker: { max_connections: 8 } # 调试用值,禁止上线
webhook-worker: { max_connections: 32 }

影响


失败请求数 (502) 约 41,200
峰值错误率 21.4%
受影响用户 约 2,300 个工作区
数据丢失 无 — 客户端已重试
SLA 违约 否(仍在月度预算内)

行动项


DP 回滚 cfg-9a12,把连接池上限恢复到 64 4 月 12 日
MO 给配置 linter 加上 max_connections 的取值范围检查(小于 32 时告警) 4 月 18 日
SR 在 on-call 看板上把"最近的配置发布"和代码发布并排展示 4 月 25 日
PA 配置变更先灰度到一个 worker 可用区,跑 10 分钟后再全量推 5 月 2 日