Skip to content
Berktug Berke Ates
Berktug Berke Ates

软件工程师

博客

设计有韧性的全栈系统

· 8 分钟阅读

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

可靠性是端到端的

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

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

契约防止级联歧义

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

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

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

按能力降级

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

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

观测决策,而不只是机器

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

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

演练恢复

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

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


由 Berktug Berke Ates 于 2025年8月7日 发布。