蓝桉云顶

Good Luck To You!

雪花id,这个神秘的标识符有何深意?

雪花ID是独一无二的标识符,用于识别和跟踪每个雪花。它们在自然界中形成时,由于温度、湿度和风速等环境因素的差异,每片雪花的形状和结构都是独特的。雪花ID可以作为区分不同雪花的重要依据。

雪花ID(Snowflake)算法详解

雪花ID(Snowflake)算法是由Twitter开源的一种分布式ID生成算法,旨在满足分布式系统中对唯一性、趋势递增和高性能等要求,该算法通过将时间戳、机器标识和序列号等信息组合成一个64位的ID,从而实现高效且唯一的ID生成。

一、雪花ID算法组成

1、符号位:1位,固定为0,用于保证生成的ID为正数。

2、时间戳:41位,记录的是自定义的epoch(起始时间)至当前时间的毫秒数,可以定义epoch为2024年1月1日0时0分0秒(时间戳为1704137600000),这样能表示的时间范围大约是69年。

3、数据中心ID:5位,可部署最多32个数据中心(IDC),每个数据中心可包含多个节点。

4、机器或节点ID:5位,标识单个数据中心内的具体节点,最多可部署32个节点。

5、序列号:12位,用于在同一毫秒内生成不同的ID,最多可生成2^12=4096个不同的ID。

二、雪花ID算法优点

1、高性能:局部线性ID生成,无需依赖数据库或其他第三方系统,性能非常高。

2、趋势递增:毫秒数在高位,自增序列在低位,整体上按照时间顺序递增,有利于数据库写入性能优化。

3、灵活性:可根据业务需求灵活分配各部分bit位,满足不同场景的需求。

4、高可用性:不依赖于单点服务,即使部分节点故障,也不会影响整体ID生成。

三、雪花ID算法缺点

1、时钟依赖:强依赖于机器时钟,如果机器时钟发生回拨,可能会导致ID重复或服务不可用。

2、复杂度:实现和维护相对复杂,需要确保时钟同步和正确的ID分配策略。

四、雪花ID算法实现方式

以百度UidGenerator为例,其基于雪花算法进行了优化和扩展,支持多种语言和平台,以下是Java版本的实现示例:

public class SnowflakeIdWorker {
    private final long workerId;
    private final long datacenterId;
    private final long twepoch = 1420041600000L; // 设置自定义epoch
    private long sequence = 0L;
    private long lastTimestamp = -1L;
    public SnowflakeIdWorker(long workerId, long datacenterId) {
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format("workerId can't be greater than %d or less than 0", maxWorkerId));
        }
        if (datacenterId > maxDatacenterId || datacenterId < 0) {
            throw new IllegalArgumentException(String.format("datacenterId can't be greater than %d or less than 0", maxDatacenterId));
        }
        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }
    public synchronized long nextId() {
        long timestamp = timeGen();
        if (timestamp < lastTimestamp) {
            throw new RuntimeException(String.format("Clock moved backwards. Refusing changes on %s (%s -> %s)", address(), lastTimestamp, timestamp));
        }
        if (lastTimestamp == timestamp) {
            sequence = (sequence + 1) & sequenceMask;
            if (sequence == 0) {
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0L;
        }
        lastTimestamp = timestamp;
        return ((timestamp twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence;
    }
    protected long tilNextMillis(long lastTimestamp) {
        long timestamp = timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = timeGen();
        }
        return timestamp;
    }
    protected long timeGen() {
        return System.currentTimeMillis();
    }
    private String address() {
        return String.format("%d.%d.%d.%d", datacenterId, workerId, sequence, lastTimestamp);
    }
}

五、常见问题解答(FAQs)

Q1: 如果机器时钟发生回拨,雪花ID算法如何应对?

A1: 雪花ID算法强依赖于机器时钟的准确性,如果机器时钟发生回拨,可能导致生成的ID重复或服务不可用,为了应对这种情况,可以实现时钟回拨检测机制,当检测到时钟回拨时,拒绝生成ID并抛出异常,或者通过逻辑时钟等方式进行补偿。

Q2: 雪花ID算法中的机器ID和数据中心ID如何分配?

A2: 机器ID和数据中心ID的分配通常根据具体的业务需求和系统架构来决定,可以按照机房-机器号、机器号-服务号等方式进行分配,重要的是要保证在整个分布式系统中,每个节点的ID都是唯一的,以避免ID冲突,也要考虑ID的分配策略对系统扩展性和可维护性的影响。

  •  轻伤
     发布于 2024-03-02 06:10:22  回复该评论
  • Python的判断闰年功能强大且易用,通过简单的逻辑和条件语句,我们可以轻松地确定一个年份是否为闰年。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年11月    »
123
45678910
11121314151617
18192021222324
252627282930
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接