小服务往往在正常路径被充分理解之前,就先累积了恢复逻辑。每一次重试、备用端点与兼容分支,都增加了必须被观察和测试的一个状态。

让常见路径变得无聊

一个有用的默认行为是明确的、易于检视的、且可安全重复的。对静态站点,可以简单到:

  1. 构建自固定的工具链。
  2. 发布一个完整目录。
  3. 检查生成的 HTML 与资源。
  4. 保留上一个目录以便回滚。

这段序列不如多阶段部署系统炫目,但它的状态可见。当某处失败时,运维者能回答:问题在源码、构建、复制还是 Web 服务器。

只对可限定范围的操作重试

当操作已知是瞬时的、且重复不会产生第二个副作用时,重试才有用。从源站下载可能可安全重试;数据库迁移则未必。把每个错误都看作可重试的,会掩盖需要关注的边界。

当重试适当时,记录尝试次数与最终原因。类似"发布失败:校验和不匹配"的日志条目,比一串静默重试后跟一个笼统超时更有可操作性。

偏好单一权威状态

配置、运行时状态与文档应一致地说明哪个目录是活动的、哪条命令产生它。如果一个发布可以被不同的人复制到三条不同路径,恢复就变成了猜谜。

对静态部署,一份简短的发布记录就够了:

release: 2026-08-22
source: git commit <commit-id>
builder: Hugo 0.165.0
output: public/
verification: links + headers + checksums

占位符 commit ID 应按设计在发布时解析,而不是在文档里杜撰。

恢复应回到已知状态

当恢复把服务带回最后一个已知良好目录,而不是在几个半成品替代品之间选择时,恢复最容易。保留上一次输出直到新输出通过检查,再按保留策略移除旧副本。

目标不是消除失败,而是把失败缩小到能解释、把恢复缩小到能信任。

来源