专栏名称: 架构师之路
架构师之路,坚持撰写接地气的架构文章
目录
相关文章推荐
美团技术团队  ·  美团大模型北斗实习计划2025——全球顶尖科 ... ·  昨天  
架构师之路  ·  DeepSeek开源V3/R1架构设计思路, ... ·  3 天前  
架构师之路  ·  探秘!DeepSeek老板梁文峰,何许人也? ·  2 天前  
架构师之路  ·  第6篇10W+,原来不跳舞也可以... ·  4 天前  
51好读  ›  专栏  ›  架构师之路

架构师究竟要不要懂细节?分布式ID生成的6种方法(第45讲)

架构师之路  · 公众号  · 架构  · 2025-03-21 08:10

正文

《架构师之路:架构设计中的100个知识点》

45.分布式ID生成

几乎所有的业务系统,都有 生成一个唯一记录标识的需求 ,例如:消息ID,订单ID,帖子ID...


这个ID,在数据库中往往用作 主键 ,且有 排序与分页 的查询需求。这也是分布式ID生成算法的两大核心需求:

1. 全局唯一;

2. 趋势递增;

如何高效生成趋势有序的全局唯一 ID 是每一个工程师都会遇到的问题。


方法一:数据库auto-inc-id法


借助数据库的 auto_increment 来生成全局唯一递增 ID。

图片

优点:

1. 简单,使用数据库已有的功能;

2. 能够保证唯一性;

3. 能够保证递增性;

4. 步长固定;


不足:

1. 可用性难以保证,需要依赖数据库的高可用;

2. 扩展性差,性能有上限,数据库主库的写性能决定 ID 的生成性能上限;


改进方法:

1. 冗余主库,避免写入单点;

2. 数据水平切分,保证各主库生成的 ID 不重复;

图片

改进后,数据库的 写压力依然很大 ,每次生成 ID 都要访问数据库。为了解决这个问题,引出了第二个常见的方案。


方法二:批量 ID 生成服务

数据库写压力大,是因为每次生成 ID 都访问了数据库,可以 使用批量的方式降低数据库写压力

图片

ID 生成服务假设每次批量拉取 6 ID ,服务访问数据库,将当前 ID 的最大值修改为 5 ,这样应用访问 ID 生成服务索要 ID ID 生成服务不需要每次访问数据库,就能依次派发 0,1,2,3,4,5 这些 ID 了。


ID 发完后,再将 ID 的最大值修改为 11 ,就能再次派发 6,7,8,9,10,11 这些 ID 了,于是数据库的压力就降低到原来的 1/6


优点

1. 保证了 ID 生成的绝对递增有序;

2. 大大的降低了数据库的压力, ID 生成可以做到每秒生成几万几十万个;


同时,服务也可以做集群化,只是稍微要注意数据一致性问题,具体CAS优化方案在《 巧用CAS实现分布式ID生成器!(43) 》中有详细介绍,不再展开。


方法三: uuid/guid法


不管是通过数据库,还是通过服务来生成 ID ,业务方 都需要进行一次远程调用,比较耗时。 有没有一种本地生成 ID 的方法,即高性能,又时延低呢?


uuid 是一种常见的方案:

string ID =GenUUID();


优点

1. 本地生成 ID ,不需要进行远程调用,时延低;

2. 扩展性好,基本可以认为没有性能上限;


不足

1. 无法保证趋势递增

2. uuid 过长,往往用字符串表示,作为主键建立索引查询效率低 ,常见优化方案为 转化为两个







请到「今天看啥」查看全文