题目:Leaf 生成分布式 ID 的原理?
难度:medium
标签:arch/distributed/id, distributed/leaf, distributed/id, difficulty/medium
评分:⭐⭐⭐☆☆(3/5)
Leaf 指的是美团的那个生成 ID 的,生成分布式 ID 的算法工具。它生成 ID 应该是有几种算法选择,一个是号段性质的,一个是类似于雪花算法性质的。号段性质的就是根据规则,然后分配号段,然后一次分,分配一批,下一批的话使用完了再申请下一批,确保局部有序。然后选择雪花算法性质的,就是根据机器去生成机器时间戳,并生成自己的分布式 ID。不知道我对 leaf 的理解对不对。我印象中它是分,可以选择生成不同的生成方式。
优点:定位准确(美团开源);说出两大核心模式(号段/雪花);有自知之明。
不足:号段模式细节缺失(双 Buffer、MySQL 表结构、本地缓存号段);雪花模式细节缺失(64 位位运算构成、时钟回拨处理);未做选型对比;未提主流分布式 ID 方案(UUID/自增/Redis/雪花/号段)。
补充:Leaf 三种模式对比——Leaf-Segment(DB + 双 Buffer + 号段)、Leaf-Snowflake(时钟+位运算+时钟回拨检测);64 位 = 1 符号 + 41 时间戳 + 10 workerId + 12 序列;时钟回拨是最大坑。
核心考点定位:考察对号段模式 + 雪花算法两种模式的底层机制 + 权衡 + 落地细节的掌握。
知识点拆解:
Leaf_alloc(id, name, max_id, step),每次通过 UPDATE ... SET max_id = max_id + step WHERE name = ? 原子获取新号段1 位符号 + 41 位时间戳 + 10 位机器 ID + 12 位自增序列| 方案 | 依赖 | 单调性 | 时钟风险 | 性能 | 场景 |
|---|---|---|---|---|---|
| UUID | 无 | 无 | 无 | 高 | 无要求 |
| DB 自增 | DB | 严格 | 无 | 低 | 单库低并发 |
| Redis INCR | Redis | 严格 | 无 | 高 | 高 QPS 简单场景 |
| 雪花算法 | 时钟 | 严格 | 有回拨 | 极高 | 高 QPS 内部 ID |
| Leaf 号段 | DB | 局部 | 无 | 高 | 业务可读(订单号) |
| Leaf-Snowflake + ZK | ZK | 严格 | 有回拨 | 极高 | 需要自动分配 workerId |
按「号段模式 → 雪花模式 → 选型对比」递进。
考察方向:
延伸递进面试题:
currentTime < lastTime 判定回拨;Leaf 严格模式抛异常报警;宽松模式等待回拨时长;使用 TSC(时间戳计数器)绕过系统时钟;使用上一台机器的时间戳(有兼容问题)面试官您好,Leaf 是美团开源的分布式 ID 生成组件,主要有两种模式:
第一种:Leaf-Segment 号段模式
Leaf_alloc(id, name, max_id, step),每次通过 UPDATE ... SET max_id = max_id + step WHERE name = ? 原子获取号段;第二种:Leaf-Snowflake 雪花算法
1 位符号 + 41 位时间戳 + 10 位机器 ID + 12 位序列号;选型建议:
主流对比:UUID 无序不可读、DB 自增 单点瓶颈、Redis INCR 依赖 Redis 可用性、雪花算法 有回拨风险、号段模式 依赖 DB 但可读性好——没有银弹,按业务需求选。