生成分布式全局唯一订单号(全局唯一ID生成服务) Distributed ID Generate Service

169 阅读2分钟

在复杂的分布式系统中全局ID生成器,通常需要满足如下需求:

1》全局唯一

2》趋势递增

3》单调递增

4》信息安全

5》含时间戳

同时需要满足高可用、低延迟、高QPS(一次生成几万个ID)

UUID

UUID.randomUUID().toString()

一、snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。

github.com/twitter-arc… 一种以划分命名空间(UUID也算,由于比较常见,所以单独分析)来生成ID的一种算法,这种方案把64-bit分别划分成多段,分开来表示机器、时间等。

其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号,最后还有一个符号位,永远是0。

比如在snowflake中的64-bit分别表示如下图(图片来自网络)所示:

image.png 优点:

整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。 毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。 可以根据自身业务特性分配bit位,非常灵活。 缺点:

强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。 针对此,美团做出了改进:github.com/Meituan-Dia…

  • 具体实现


二、 百度UidGenerator算法

三、叶子Leat 美团 (There are no two identical leaves in the world.)Distributed ID Generate Service

GitHub - Meituan-Dianping/Leaf: Distributed ID Generate Service

四、分布式高效ID

gitee.com/yu120/seque…

生成 0-99 循环 序列


public static void main(String[] args) {
         index = 0;
        System.out.println(index);
        System.out.println(index % 100);
        System.out.println(String.valueOf((index % 100) + 100));
        System.out.println(String.valueOf((index % 100) + 100).substring(1, 3));
        index = 99;
        System.out.println(index);
        System.out.println(index % 100);
        System.out.println(String.valueOf((index % 100) + 100));
        System.out.println(String.valueOf((index % 100) + 100).substring(1, 3));
        index = 100;
        System.out.println(index);
        System.out.println(index % 100);
        System.out.println(String.valueOf((index % 100) + 100));
        System.out.println(String.valueOf((index % 100) + 100).substring(1, 3));
}

0
0
100
00

99
99
199
99

100
0
100
00


生成 0-99 循环 序列