<?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>我的博客</title><link>https://blog.example.com/</link><description>我的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 12 Nov 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://blog.example.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>开始写博客</title><link>https://blog.example.com/posts/hello-world/</link><pubDate>Thu, 12 Nov 2026 10:00:00 +0800</pubDate><guid isPermaLink="true">https://blog.example.com/posts/hello-world/</guid><description>第一篇示例文章，说明这个博客的写作与发布方式。</description><category>工程实践</category><content:encoded>&lt;p&gt;这是第一篇示例文章，用来验证 Markdown 通道、RSS 与站内搜索是否工作正常。&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;写作与发布&#10; &#10; &#10; &#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;文章的发布流程只有一步：推送到 &lt;code&gt;main&lt;/code&gt; 分支。&lt;/p&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add content/posts/hello-world.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;post: hello world&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;推送后 Cloudflare Pages 会依次执行内容检查、Hugo 构建和 Pagefind 索引生成，全部成功才会替换线上版本。&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;标签&#10; &#10; &#10; &#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;每篇文章必须带 1–3 个标签，标签值来自仓库里的受控词表，构建前会校验数量、重复和是否存在。&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;下一步&#10; &#10; &#10; &#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;新增文章：在 &lt;code&gt;content/posts/&lt;/code&gt; 下新建 Markdown 文件。&lt;/li&gt;&#10;&lt;li&gt;新增长文档：在 &lt;code&gt;content/posts/&amp;lt;slug&amp;gt;/index.html&lt;/code&gt; 写 HTML 片段。&lt;/li&gt;&#10;&lt;li&gt;新增标签：先更新受控词表，再在文章里使用。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</content:encoded></item><item><title>从零理解 Raft：示例长文档</title><link>https://blog.example.com/posts/raft/</link><pubDate>Thu, 12 Nov 2026 10:00:00 +0800</pubDate><guid isPermaLink="true">https://blog.example.com/posts/raft/</guid><description>一篇用 HTML 直接编写的阅读型长文档示例，验证 doc 布局与 RSS 全文输出。</description><category>分布式系统</category><category>阅读笔记</category><content:encoded>&#10;&lt;section&gt;&#10; &lt;p&gt;这篇文档是 HTML 长文档通道的示例。源文件是 &lt;code&gt;content/posts/raft/index.html&lt;/code&gt;，正文只保留片段，不带 &lt;code&gt;html&lt;/code&gt;、&lt;code&gt;head&lt;/code&gt;、&lt;code&gt;body&lt;/code&gt; 外壳。&lt;/p&gt;&#10;&lt;/section&gt;&#10;&#10;&lt;section&gt;&#10; &lt;h2&gt;为什么需要共识&lt;/h2&gt;&#10; &lt;p&gt;单机系统只需要一个写入者；一旦复制到多台机器，就必须在“部分节点不可用”的前提下仍然对同一顺序达成一致。Raft 把这个问题拆成三块：选举、日志复制和安全性。&lt;/p&gt;&#10; &lt;p&gt;节点只有三种状态：Follower、Candidate、Leader。任意时刻最多一个 Leader，任期号单调递增。&lt;/p&gt;&#10;&lt;/section&gt;&#10;&#10;&lt;section&gt;&#10; &lt;h2&gt;选举流程&lt;/h2&gt;&#10; &lt;ol&gt;&#10; &lt;li&gt;Follower 在选举超时后转为 Candidate，任期加一，并向其他节点拉票。&lt;/li&gt;&#10; &lt;li&gt;获得多数票的 Candidate 成为 Leader，开始发送心跳。&lt;/li&gt;&#10; &lt;li&gt;如果收到任期更大的消息，立即退回 Follower。&lt;/li&gt;&#10; &lt;/ol&gt;&#10; &lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&lt;th&gt;状态&lt;/th&gt;&lt;th&gt;行为&lt;/th&gt;&lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&lt;td&gt;Follower&lt;/td&gt;&lt;td&gt;被动接收日志与心跳&lt;/td&gt;&lt;/tr&gt;&#10; &lt;tr&gt;&lt;td&gt;Candidate&lt;/td&gt;&lt;td&gt;发起投票，等待多数派&lt;/td&gt;&lt;/tr&gt;&#10; &lt;tr&gt;&lt;td&gt;Leader&lt;/td&gt;&lt;td&gt;接收写入并复制日志&lt;/td&gt;&lt;/tr&gt;&#10; &lt;/tbody&gt;&#10; &lt;/table&gt;&#10;&lt;/section&gt;&#10;&#10;&lt;section&gt;&#10; &lt;h2&gt;日志复制&lt;/h2&gt;&#10; &lt;p&gt;Leader 把客户端请求追加为日志条目，并行发送给所有 Follower。多数节点确认后条目即为已提交，随后在状态机上按序应用。&lt;/p&gt;&#10; &lt;pre&gt;&lt;code&gt;AppendEntries(term, leaderId, prevLogIndex, prevLogTerm, entries, leaderCommit)&lt;/code&gt;&lt;/pre&gt;&#10; &lt;p&gt;Follower 只有在 &lt;code&gt;prevLogIndex&lt;/code&gt; 与 &lt;code&gt;prevLogTerm&lt;/code&gt; 都匹配时才接受新条目，否则拒绝并要求 Leader 回退。&lt;/p&gt;&#10;&lt;/section&gt;&#10;&#10;&lt;section&gt;&#10; &lt;h2&gt;与 RSS 的关系&lt;/h2&gt;&#10; &lt;p&gt;这篇文档会以全文进入 &lt;code&gt;/rss.xml&lt;/code&gt;，正文 HTML 做 XML 转义后放入 &lt;code&gt;content:encoded&lt;/code&gt;。订阅器里保留语义结构，但不保证站内样式；页面样式只作用于站点本身。&lt;/p&gt;&#10;&lt;/section&gt;&#10;</content:encoded></item></channel></rss>