• 分布式雪花算法


    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

     

  • 相关阅读:
    Vue图片URL转File实践[已解决跨域问题]
    小白入门——Python标准库和第三方库简介
    线程安全问题
    LeetCode算法题---第2天
    VisualODX——ODX数据自动转换工具
    国产有什么低价好用的电容笔?四大款热销电容笔推荐
    【图像分类】【深度学习】【轻量级网络】【Pytorch版本】MobileNets_V2模型算法详解
    MIT-BIH-AF 数据集开发库
    智慧城市中的数字孪生:数字孪生技术助力智慧城市提高公共服务水平
    随机数---抽奖
  • 原文地址:https://blog.csdn.net/qq_35634154/article/details/126511583