分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUID,但是 UUID 有一些缺点,首先他相对比较长,另外 UUID 一般是无序的
有些时候我们希望能使用一种简单些的 ID,并且希望 ID 能够按照时间有序生成

什么是雪花算法
Snowflake 中文的意思是雪花,所以常被称为雪花算法,是 Twitter 开源的分布式 ID 生成算法
Twitter 雪花算法生成后是一个 64bit 的 long 型的数值,组成部分引入了时间戳,基本保持了自增
SnowFlake 算法的优点:
- 高性能高可用:生成时不依赖于数据库,完全在内存中生成
- 高吞吐:每秒钟能生成数百万的自增 ID
- ID 自增:存入数据库中,索引效率高
SnowFlake 算法的缺点:
依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成 ID 冲突或者重复
雪花算法组成
snowflake 结构如下图所示:

包含四个组成部分
不使用:1bit,最高位是符号位,0 表示正,1 表示负,固定为 0
时间戳:41bit,毫秒级的时间戳(41 位的长度可以使用 69 年)
标识位:5bit 数据中心 ID,5bit 工作机器 ID,两个标识位组合起来最多可以支持部署 1024 个节点

序列号:12bit 递增序列号,表示节点毫秒内生成重复,通过序列号表示唯一,12bit 每毫秒可产生 4096 个 ID
通过序列

本文介绍了Twitter的雪花算法,一种生成64位long型全局唯一ID的分布式算法。雪花算法由时间戳、数据中心ID、工作机器ID和序列号组成,具有高性能、高可用和有序性等优点。然而,在系统时间不一致或标识位重复时,可能会产生ID冲突。为了解决冲突,文章探讨了如何定义和分配标识位,包括预分配和动态分配策略,并提出了通过Redis的Lua脚本来实现动态分配,确保在1024个节点下的ID唯一性。最后,讨论了在节点超过1024时的扩展方案以及开源分布式ID框架的选择。
最低0.47元/天 解锁文章
418

被折叠的 条评论
为什么被折叠?



