分布式雪花算法
Snowflake,雪花算法是由 Twitter 开源的分布式 ID 生成算法,以划分命名空间的方式将 64-bit 位分割成多个部分,每个部分代表不同的含义。这种就是将 64 位划分为不同的段,每段代表不同的涵义,基本就是时间戳、机器 ID 和序列数。为什么如此重要?因为它提供了一种 ID 生成及生成的思路,当然这种方案就是需要考虑时钟回拨的问题以及做一些 buffer 的缓冲设计提高性能。
雪花算法-Snowflake
Snowflake,雪花算法是由 Twitter 开源的分布式 ID 生成算法,以划分命名空间的方式将 64-bit 位分割成多个部分,每个部分代表不同的含义。而 Java 中 64bit 的整数是 Long 类型,所以在 Java 中 SnowFlake 算法生成的 ID 就是 long 来存储的。
1、第 1 位占用 1bit,其值始终是 0,可看做是符号位不使用。
2、第 2 位开始的 41 位是时间戳,41-bit 位可表示 2^41 个数,每个数代表毫秒,那么雪花算法可用的时间年限是(1L<<41)/(1000L360024*365)=69 年的时间。
3、中间的 10-bit 位可表示机器数,即 2^10 = 1024 台机器,但是一般情况下我们不会部署这么台机器。如果我们对 IDC(互联网数据中心)有需求,还可以将 10-bit 分 5-bit 给 IDC,分 5-bit 给工作机器。这样就可以表示 32 个 IDC,每个 IDC 下可以有 32 台机器,具体的划分可以根据自身需求定义。
4、最后 12-bit 位是自增序列,可表示 2^12 = 4096 个数。
这样的划分之后相当于在一毫秒一个数据中心的一台机器上可产生 4096 个有序的不重复的 ID。但是我们 IDC 和机器数肯定不止一个,所以毫秒内能生成的有序 ID 数是翻倍的。
雪花算法提供了一个很好的设计思想,雪花算法生成的 ID 是趋势递增,不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成 ID 的性能也是非常高的,而且可以根据自身业务特性分配 bit 位,非常灵活。
但是雪花算法强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。如果恰巧回退前生成过一些 ID,而时间回退后,生成的 ID 就有可能重复。官方对于此并没有给出解决方案,而是简单的抛错处理,这样会造成在时间被追回之前的这段时间服务不可用。
如若转载,请注明出处:开源字节 https://sourcebyte.cn/article/223.html
评论