1. 分布式ID生成器
分布ID的特点:
- 全局唯一性:不能出现有重复的ID标识,这是基本要求;
- 递增性:确保生成的ID对于用户或业务是递增的;
- 高可用性:确保任何时候都能生成正确的ID;
- 高性能性:在高并发的环境下依然表现良好。
2. snowflake
算法
Twitter
开源的由64位整数组成分布式ID,性能较高,并且在单机上递增:
2.1. 第一位
占用1bit,其值始终是0,无符号整数
2.2. 时间戳
占用41bit,单位为毫秒,总共可以容纳约69年的时间。当然,我们的时间毫秒计数不一定要从1970年开始记,否则32位溢出,即系统跑到2039/9/7 23:47:35
就不能用了,所以这里的时间戳只是相对于某个时间的增量,比如系统上线日期是2000-01-01
,那么完全可以把这个timestamp
当作是从2000-01-01 00:00:00.000
的偏移量。
2.3. 工作机器id
占用10bit,其中高位5bit是数据中心ID,低位5bit是工作节点ID,最多可以容纳1024个节点。
2.4. 序列号
占用12bit,用来记录同毫秒内产生的不同id,每个节点每毫秒0开始不断累加,最多到4096,同一毫秒一共可以生产4096个ID。
snowflake
算法在同一毫秒内最多可以生产多少个全局唯一ID呢?
同一毫秒数量 = 1024*4096 = 4194304
3. snowflake
的Go实现
一个轻量化的
snowflake
的Go实现1bit Unused | 41bit Timestamp | 10bit NodeID | 12bit SequenceID |
---|---|---|---|
0 | 00000000000...0...0000000000 | 0000000000 | 000000000000 |