只有第一发失败要查冷启动与连接重试.md

**「每个会话的第一发稳定失败、点重试就好」这种模式,先查服务端无状态依赖的冷启动,而不是业务逻辑。** 实例:Neon serverless 计算实例闲置后自动挂起,下一次连接要先唤醒(约 2.1s 握手),第一发的查询在唤醒完成前失败 → 应用层 DB 操作没有任何重试 → 整个 turn 被兜底成 500 → 前端弹「暂时遇到问题」;重试时实例已热,秒过。

分诊要点

  • 失败点是稳定的、可重复的(每次会话首发、耗时相近)⇒ 排除随机 bug,找「一次性初始化」的东西。
  • 失败发生在业务动作之前:本例卡在写用户消息 + 建 turn 租约的 DB 操作,在 reply.hijack()(设 200)之前,所以拿到的是未映射的内部错误(领域错误会是 409/400),而不是明确的业务错误码。
  • 错误文本看不到时,先确认日志级别(logger: false 会让「日志干净」变成假象),再决定要不要临时开日志复现。

修在哪一层

补最底层那格:给 DB 写入加 1~2 次短退避重试。不要动「整轮 turn 自动重跑」——一个 turn 里可能已经产生副作用(模型已调用、已计费、已建提案),盲目重跑会重复执行。

第二处实例(2026-08-03 @ 15:54)

同一种形态再现于 Neon:P1001: Can't reach database server 发生在 migrate deploy 时,SQL 根本没执行(migration 仍是待执行状态);同一命令重试即成功。判据一样 —— 连接层的瞬时失败不要当成「SQL 写错了」,先复测连接(域名解析 / 5432 端口 / 能否读库状态),再决定重跑还是查语句。

相关