<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Design · XB 现场笔记</title><link>https://www.xbcatm.com/zh/tags/design/</link><description>基于 HTTP、DNS、TLS、Caddy、SSH、发布与恢复的可复现运维现场笔记。</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://www.xbcatm.com/zh/tags/design/index.xml" rel="self" type="application/rss+xml"/><item><title>可靠的默认行为胜过聪明的恢复</title><link>https://www.xbcatm.com/zh/notes/reliable-defaults-beat-clever-recovery/</link><pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate><guid>https://www.xbcatm.com/zh/notes/reliable-defaults-beat-clever-recovery/</guid><description>一条可预测的首要路径比复杂的兜底更能预防事故。</description><content:encoded>&lt;p&gt;小服务往往在正常路径被充分理解之前，就先累积了恢复逻辑。每一次重试、备用端点与兼容分支，都增加了必须被观察和测试的一个状态。&lt;/p&gt;
&lt;h2 id="让常见路径变得无聊"&gt;让常见路径变得无聊&lt;/h2&gt;
&lt;p&gt;一个有用的默认行为是明确的、易于检视的、且可安全重复的。对静态站点，可以简单到：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;构建自固定的工具链。&lt;/li&gt;
&lt;li&gt;发布一个完整目录。&lt;/li&gt;
&lt;li&gt;检查生成的 HTML 与资源。&lt;/li&gt;
&lt;li&gt;保留上一个目录以便回滚。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这段序列不如多阶段部署系统炫目，但它的状态可见。当某处失败时，运维者能回答：问题在源码、构建、复制还是 Web 服务器。&lt;/p&gt;
&lt;h2 id="只对可限定范围的操作重试"&gt;只对可限定范围的操作重试&lt;/h2&gt;
&lt;p&gt;当操作已知是瞬时的、且重复不会产生第二个副作用时，重试才有用。从源站下载可能可安全重试；数据库迁移则未必。把每个错误都看作可重试的，会掩盖需要关注的边界。&lt;/p&gt;
&lt;p&gt;当重试适当时，记录尝试次数与最终原因。类似&amp;quot;发布失败：校验和不匹配&amp;quot;的日志条目，比一串静默重试后跟一个笼统超时更有可操作性。&lt;/p&gt;
&lt;h2 id="偏好单一权威状态"&gt;偏好单一权威状态&lt;/h2&gt;
&lt;p&gt;配置、运行时状态与文档应一致地说明哪个目录是活动的、哪条命令产生它。如果一个发布可以被不同的人复制到三条不同路径，恢复就变成了猜谜。&lt;/p&gt;
&lt;p&gt;对静态部署，一份简短的发布记录就够了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;release: 2026-08-22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source: git commit &amp;lt;commit-id&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;builder: Hugo 0.165.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;output: public/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;verification: links + headers + checksums
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;占位符 commit ID 应按设计在发布时解析，而不是在文档里杜撰。&lt;/p&gt;
&lt;h2 id="恢复应回到已知状态"&gt;恢复应回到已知状态&lt;/h2&gt;
&lt;p&gt;当恢复把服务带回最后一个已知良好目录，而不是在几个半成品替代品之间选择时，恢复最容易。保留上一次输出直到新输出通过检查，再按保留策略移除旧副本。&lt;/p&gt;
&lt;p&gt;目标不是消除失败，而是把失败缩小到能解释、把恢复缩小到能信任。&lt;/p&gt;
&lt;h2 id="来源"&gt;来源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9110.html"&gt;RFC 9110 — HTTP Semantics&lt;/a&gt;，9.2.2 节关于幂等方法与重试，已核验 2026-08-22。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.xbcatm.com/zh/resources/"&gt;静态网站发布检查清单&lt;/a&gt;，本地配套资源。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>