这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
雪花算法原理
雪花算法(Snowflake)是 Twitter 开源的分布式 ID 生成算法,它使用 64 位长整型生成全局唯一且趋势递增的 ID。
算法简介
1. 背景
起源:
- Twitter 在 2010 年开源
- 用于生成 Tweet ID
- 解决分布式 ID 生成问题
特点:
✅ 全局唯一
✅ 趋势递增
✅ 高性能
✅ 无需中心协调
✅ 分布式友好2. ID 结构
64 位结构:
0 | 00000000000000000000000000000000000000 | 0000000000 | 000000000000
↑ └─────────────── 41 位时间戳 ─────────────┘ └─ 10 位机器 ID ┘ └─ 12 位序列号 ┘
│ ↑
符号位(0) 总共 64 位结构详解:
| 部分 | 位数 | 说明 |
|---|---|---|
| 符号位 | 1 | 固定为 0,表示正数 |
| 时间戳 | 41 | 毫秒级时间戳 |
| 机器 ID | 10 | 工作节点 ID(5位数据中心ID + 5位机器ID) |
| 序列号 | 12 | 同一毫秒内的序列 |
3. ID 生成示例
假设:
- 时间戳:1712701200000(2024-04-10 00:00:00)
- 数据中心 ID:1
- 机器 ID:2
- 序列号:0
生成的 ID:
0 | 000110011001101010101001001000010011000000 | 0000100001 | 000000000000时间戳设计
1. 41 位时间戳
计算:
41 位时间戳可以表示:
2^41 = 2,199,023,255,552 毫秒
= 2,199,023,255.552 秒
= 36,650,387.592 分钟
= 610,839.793 小时
= 25,451.658 天
≈ 69.7 年使用年限:
起始时间:2024-04-10 00:00:00
结束时间:2093-11-17 00:00:00
可以使用约 70 年2. 相对时间戳
原理: 使用相对时间戳,节省位数。
实现:
机器 ID 设计
1. 10 位机器 ID
结构:
0000000000
↑ ↑
数据中心ID 机器ID
5位 5位容量计算:
数据中心 ID:5 位 = 32 个数据中心
机器 ID:5 位 = 32 台机器/数据中心
总容量:32 × 32 = 1024 个节点2. 数据中心 ID 分配
策略:
数据中心 0:北京机房
数据中心 1:上海机房
数据中心 2:深圳机房
数据中心 3:杭州机房
...3. 机器 ID 分配
策略:
方案 1:手动分配
- 管理员手动为每台机器分配 ID
- 需要 ID 管理系统
方案 2:自动分配
- 使用 ZooKeeper / etcd 协调分配
- 需要协调服务
方案 3:基于 IP/主机名
- 基于 IP 地址的最后几位
- 可能冲突序列号设计
1. 12 位序列号
容量:
12 位序列号可以表示:
2^12 = 4,096 个 ID/毫秒QPS 计算:
每毫秒 4,096 个 ID
每秒 4,096 × 1,000 = 4,096,000 个 ID
理论 QPS:> 4,000,0002. 序列号递增
原理: 同一毫秒内,序列号从 0 递增到 4095。
实现:
完整方案
1. Java 实现
2. 使用示例
性能特性
1. 性能测试
测试结果:
单线程:500,000 QPS
多线程(10):1,000,000 QPS
多线程(100):2,000,000 QPS
延迟:< 0.01ms2. 性能优势
✅ 本地生成,无网络开销
✅ 无需锁,性能高
✅ CPU 占用低
✅ 内存占用少适用场景
✅ 适合使用
1. 分布式系统
✅ 多节点部署
✅ 无需中心协调
✅ 高性能要求2. 大规模系统
✅ 用户量 > 100万
✅ QPS > 10,000
✅ 需要水平扩展3. 需要有序性
✅ 趋势递增
✅ 便于查询
✅ 便于排序❌ 不适合使用
1. 时钟不稳定
❌ 时钟频繁回拨
❌ 时钟精度差2. 需要严格递增
❌ 需要严格递增
❌ 趋势递增不满足总结
雪花算法评价
| 维度 | 评分 | 说明 |
|---|---|---|
| 唯一性 | ⭐⭐⭐⭐⭐ | 理论保证 |
| 有序性 | ⭐⭐⭐⭐⭐ | 趋势递增 |
| 性能 | ⭐⭐⭐⭐⭐ | 高性能 |
| 可用性 | ⭐⭐⭐⭐ | 本地生成 |
| 扩展性 | ⭐⭐⭐⭐ | 分布式友好 |
使用建议
强烈推荐:
✅ 分布式系统
✅ 大规模系统
✅ 高性能要求
✅ 需要有序性下一步
了解了雪花算法原理后,我们学习时钟回拨问题及解决方案。
👉 下一节:时钟回拨