返回知识库

数据与服务 · 网络与接口

服务器错误5xx Error

5xx 表示服务端或上游依赖自己出了问题,客户端请求没错;它通常瞬时,按码退避重试或等待 Retry-After,写入要先确认幂等,每一条都该进监控告警。

5xx 分诊台:服务端到底怎么了

每条 5xx 都是一次服务端事件。读症状与服务端证据,先判码(500/502/503/504),再决定客户端该怎么做;提交后工单盖上对应章并展开成因与下一步。

POST/api/orders

提交创建订单,返回 500;页面保留表单与 request id,没有跳转。

服务端证据服务端日志:NullPointerException at OrderService.create():142(未捕获异常)。

这单判哪个码?
客户端该怎么处理?
已正确 0/4

第 1/4 单:读症状与日志,先判码(500/502/503/504),再选客户端动作。

知识点:服务端的锅,通常瞬时

分诊台里反复出现同一条主线——首位 5 表示服务端自己出了问题,客户端请求没错,且大多数 5xx 是瞬时的,退避后重试可能成功。

  • 锅在服务端500 是应用崩、502/504 是网关报告上游、503 是服务端主动拒绝;客户端的请求格式与身份都没错,重发同样的请求本身合理。
  • 四兄弟各不同500 应用异常、502 上游无效响应、503 过载/维护/熔断、504 上游超时;看证据(异常栈/网关日志/Retry-After)分流。
  • 通常瞬时多数 5xx 随上游恢复、重启完成或流量回落而消失,所以退避后重试是默认选项——但写入要先确认幂等。
  • 别立即重试立即并发重试会把正在恢复的服务端压垮,放大故障;指数退避 + 抖动 + 总次数与总时长上限才是安全节奏。
  • 分清层看到 5xx 状态码说明请求已到达服务端;根本没连上、没收到码,是 network-error,不在本卡范围。

什么时候用:看到 5xx 状态码时

从用户信号到工程动作:收到 5xx 响应,就进入「止损—恢复—验证」节奏,而不是把异常塞回用户脸上。

  • 客户端止损保留用户输入与 request id,展示稳定的错误 code、简短原因与可执行入口;明确「未确认完成」时绝不说成功。
  • 按码重试幂等读取(GET/HEAD)用指数退避 + 抖动有限重试;503 尊重 Retry-After;非幂等写入(POST 创建/支付)先确认幂等键或走人工。
  • 服务端止损隔离可疑依赖、打开熔断、降级或只读,让健康路径继续服务,避免级联雪崩。
  • 每条都告警5xx 是 bug 信号,必须进监控告警与错误追踪(日志/Sentry),按版本、路由、trace 关联,而不是被静默吞掉。
  • 统一契约·不泄密给客户端返回统一的 error 契约(呼应 response),绝不回显堆栈、SQL、主机名或 token。

正反例:把 5xx 当事件,还是当垃圾桶

同样收到创建订单失败,服务端怎么响应,决定了监控、重试和对账能不能各司其职。

正例500 + 统一契约 + 告警

返回稳定的 500 与 request id,正文是统一 error 契约;保留输入,写入用幂等键可查询;监控按版本聚合,值班能看到峰值。

客户端按 5xx 退避重试或人工确认,不会重复下单;故障被定位、被恢复,而不是被掩盖。

反例500 当垃圾桶 + 吐堆栈

客户端参数校验没过也返 500、业务流程异常也返 500;响应体直接抛堆栈和 SQL,前端只能白屏或盲目重试。

所有问题混成一团,监控无法区分根因,重试还可能重复扣款——5xx 不再是信号,而成了甩锅的垃圾桶。

快速自测

GET /api/feed 持续返回 502,上游服务健康但正在预热,客户端最稳妥的处理是?

继续查证

术语的技术定义和行为以这些一手或权威资料为准。

下一步学

和本知识点经常一起出现的概念。