雪花ID (Snowflake ID)
概述
雪花ID是一种分布式系统唯一ID生成算法,由Twitter公司开发并开源。它能够在分布式环境下生成全局唯一的64位长整型ID,适用于高并发场景下的ID生成需求。生成的ID具有以下特点:
- 64位整数:兼容各种数据库和系统
- 时间有序:按时间递增排序
- 分布式唯一:支持多节点同时生成不重复ID
结构组成
雪花ID的64位结构被划分为以下部分:
- 1位符号位:始终为0,保证ID为正数
- 41位时间戳:记录ID生成时间(毫秒级),可使用约69年
- 10位工作机器ID:
- 5位数据中心ID (datacenterId)
- 5位机器ID (workerId)
- 12位序列号:同一毫秒内的计数器,支持每毫秒生成4096个ID
特点
- 全局唯一性:通过时间戳+机器ID+序列号的组合保证
- 有序递增:时间戳在前,ID随时间递增
- 高性能:本地生成,无需网络请求
- 可反解:可以从ID中提取生成时间、机器信息等
实现示例
1import time 2 3class Snowflake: 4 def __init__(self, worker_id, epoch=1609459200): # 2021-01-01作为基准时间 5 self.worker_id = worker_id 6 self.sequence = 0 7 self.last_timestamp = -1 8 self.epoch = epoch 9 10 def generate(self): 11 timestamp = int(time.time() * 1000) - self.epoch 12 13 if timestamp == self.last_timestamp: 14 self.sequence = (self.sequence + 1) & 4095 15 if self.sequence == 0: 16 timestamp = self._wait_next_millis() 17 else: 18 self.sequence = 0 19 20 self.last_timestamp = timestamp 21 22 return (timestamp << 22) | (self.worker_id << 12) | self.sequence 23 24 def _wait_next_millis(self): 25 timestamp = int(time.time() * 1000) - self.epoch 26 while timestamp <= self.last_timestamp: 27 timestamp = int(time.time() * 1000) - self.epoch 28 return timestamp 29
应用场景
- 分布式系统主键生成
- 订单编号、交易流水号
- 消息队列消息ID
- 分布式锁唯一标识
注意事项
- 时钟回拨问题:服务器时间回拨会导致ID重复,需实现异常处理
- 机器ID分配:需要确保不同机器的workerId不重复
- 41位时间戳限制:算法约69年后会溢出,需提前规划