<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>系统设计 on giftiaのblog</title><link>https://hch1212.github.io/tags/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/</link><description>Recent content in 系统设计 on giftiaのblog</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Mon, 10 Aug 2026 09:00:27 +0000</lastBuildDate><atom:link href="https://hch1212.github.io/tags/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/index.xml" rel="self" type="application/rss+xml"/><item><title>分布式ID</title><link>https://hch1212.github.io/posts/2026/08/%E5%88%86%E5%B8%83%E5%BC%8Fid/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><guid>https://hch1212.github.io/posts/2026/08/%E5%88%86%E5%B8%83%E5%BC%8Fid/</guid><description>&lt;h2 id="一句话定义"&gt;一句话定义&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;分布式 ID&lt;/strong&gt; 就是在分库分表、微服务这些场景下，各节点不靠单库自增，自己生成&lt;strong&gt;全局唯一、趋势递增&lt;/strong&gt;的 ID。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="为什么需要它"&gt;为什么需要它&lt;/h2&gt;
&lt;p&gt;单机时代，MySQL 自增主键 &lt;code&gt;AUTO_INCREMENT&lt;/code&gt; 足够。到了分布式场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分库分表&lt;/strong&gt;：多个库各自自增，ID 必然冲突。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微服务&lt;/strong&gt;：用户服务、订单服务各自独立部署，不能共享一个 &lt;code&gt;auto_increment&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以得自己搞一套 ID 生成机制，不依赖单库自增。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;先记住三句话&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;全局唯一是底线，趋势递增是加分项。&lt;/strong&gt; 唯一性不满足直接炸；不趋势递增只是索引性能差，不会出错。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;雪花算法去中心化但怕时钟回拨，号段模式性能好但依赖 DB。&lt;/strong&gt; 没有银弹，只有权衡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生产环境优先用现成的轮子。&lt;/strong&gt; 美团 Leaf、百度 UIDGenerator 都比自己手写靠谱。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="方案概览"&gt;方案概览&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;方案&lt;/th&gt;
 &lt;th&gt;全局唯一&lt;/th&gt;
 &lt;th&gt;趋势递增&lt;/th&gt;
 &lt;th&gt;纯数字&lt;/th&gt;
 &lt;th&gt;依赖外部&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;UUID&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;无序&lt;/td&gt;
 &lt;td&gt;N&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;数据库自增&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;DB&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;号段模式&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;DB（低频）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;雪花算法&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;无&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Redis 自增&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;Y&lt;/td&gt;
 &lt;td&gt;Redis&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="uuid最简单的方案"&gt;UUID：最简单的方案&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;github.com/google/uuid&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;New&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;String&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 550e8400-e29b-41d4-a716-446655440000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;一句话：&lt;/strong&gt; UUID 随手生成、几乎不可能冲突，但有两个致命伤——&lt;strong&gt;字符串太长&lt;/strong&gt;（128 位，存成字符串 36 字节）且&lt;strong&gt;完全无序&lt;/strong&gt;，做 MySQL InnoDB 主键时页分裂非常严重。&lt;/p&gt;</description></item></channel></rss>