分布式ID

2021-08-14  本文已影响0人  贪挽懒月

1. 是什么?

分布式 ID 就是在分布式项目中我们给数据库记录用的 ID。和单机版项目有啥不同呢?单机版的我们可以用 数据库自增等方式来生成 ID,但是分布式项目中,项目部署在好几台机器上,数据库自增也是有可能会出现重复的情况。所以就需要一种算法来生成适用于分布式系统的 ID。

2. 生成分布式 ID 的算法要求:

3. 生成分布式 ID 系统的可用性要求:

我们用一个系统来生成分布式 ID,那么这个系统必须符合以下条件:

4. 分布式 ID 的生成方案:

create table t_test(
    id bigint(20) unsigned not null auto_increment primary key,
    col char(1) not null default '',
    unique key col (col)
)

然后我们可以执行语句:

replace into t_test (col) values('a');

每执行一次,t_test 表的 id 字段值就会自增,我们就可以用这个 id 来做分布式 ID。这个方案对于并发量不高的系统足够了,但是并发量高的话还是不行的。首先用来生成 ID 的这个 MySQL 扛不住高并发,一秒钟生成10w个肯定是做不到的。

所以以上三种方案都存在一定的缺点,现在比较流行的是用雪花算法。

5. 雪花算法:

雪花算法是推特开源的一套用于生成分布式 ID 的算法。它可以生成一个 64bit 大小的整数,类型是 Long,转成字符串后最长是19位。

(1). 雪花算法的组成:

0         0000000000 0000000000 0000000000 0000000000 0         0000000000      0000000000 00
1bit符号位                这 41 bit 是时间戳                  10 bit 工作进程位     12bit 序列号位

1 + 41 + 10 + 12 的结构,总共 64bit,所以刚好可以对应 java 的 long 类型,所以雪花算法生成的 id 就用 long 类型存储。

(2). 怎么用?

hutool 工具包已经给我们封装好了,只需要在项目中引入:

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-captcha -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-captcha</artifactId>
    <version>5.6.6</version>
</dependency>

然后通过如下方式即可获取到雪花算法生成的 ID:

public class SnowFlakeUtil {

    public static long snowFlakeId(long workerId, long datacenterId){
        Snowflake snowflake = IdUtil.getSnowflake(workerId, datacenterId);
        return snowflake.nextId();
    }

    public static void main(String[] args){
        ExecutorService service = Executors.newFixedThreadPool(5);
        // 机器的workerId
        long workerId = 1;
        // 机房ID
        long datacenterId = 1;
        for (int i = 0; i < 20; i++) {
            service.submit(() ->{
                System.out.println(snowFlakeId(workerId, datacenterId));
            });
        }
        service.shutdown();
    }
}

(3). 雪花算法优缺点:

优点是简单易用,有序递增,带时间戳,也满足信息安全。缺点也有,就是依赖机器时钟,可能会有时钟回拨问题。如果两台服务器的时间不同步,可能会导致生成重复的 ID。

(4). 雪花算法的优化:

百度开源的 UidGenerator 和美团开源的 Leaf 就解决了时钟回拨问题。

上一篇下一篇

猜你喜欢

热点阅读