# 设计有韧性的全栈系统

可靠性始于产品边界，远早于基础设施失败。

Published: 2025-08-07

## 可靠性是端到端的

健康的数据库不保证可靠的产品。用户体验的是一条链：设备状态、网络条件、边缘基础设施、应用代码、队列、第三方服务与人工运维。韧性来自理解该链，并选择在何处吸收失败。

从关键用户旅程开始。识别什么必须同步成功、什么可延迟、什么可重试、什么绝不能发生两次。这比把通用可用性模式套到每个端点更有用。

## 契约防止级联歧义

类型化 API 有帮助，但有韧性的契约还定义超时、错误类别、幂等性、分页、版本兼容与授权行为。客户端应能区分校验问题、临时依赖失败与权限拒绝。

幂等键对支付、订单、消息以及客户端可能重试的任何变更至关重要。请求超时并不告诉客户端服务器是否已完成操作。没有稳定键与可查询的操作状态，重试会变成数据损坏。

- 使用稳定的机器可读错误码
- 让变更结果可查询
- 为每次网络调用设置超时
- 为移动客户端设计向后兼容

## 按能力降级

优雅降级应保留产品的有用核心。若推荐失败，搜索可能仍可用。若实时更新断开，带时间戳的快照可能仍可读。若媒体处理延迟，上传可被接受并异步完成。

功能边界使之成为可能。当一项依赖嵌入每条路由与渲染路径时，其中断会变成全局。把可选能力隔离在清晰接口后，缓存安全结果，并确保界面传达新鲜度，而非把陈旧数据静默呈现为当前。

## 观测决策，而不只是机器

基础设施指标揭示资源压力。产品级遥测揭示破裂结果。用关联标识跨客户端、API、队列与 worker 追踪用户操作。记录有意义的转换，如订单已接受、支付已授权、资产已处理、通知已送达。

日志应结构化、注重隐私，并连接到运维问题。仪表盘需要与旅程绑定的服务水平指标，而告警应识别需要行动的条件。频繁触发且不改变任何决策的告警是噪声，会削弱整个响应系统。

## 演练恢复

备份在恢复被测试前只是意图。队列在毒消息阻塞进度前是持久的。运行手册在假设响应者没有的访问或知识前是有用的。定期恢复演练在系统平静时暴露这些缺口。

韧性最终是让失败不再令人意外的能力。团队无法消除每个事故，但可以创造有界失败、可见状态、安全重试与经过演练的恢复路径，同时保护用户与工程师。
