首页  >  文章  >  web前端  >  SnowUUID 简介:受 Snowflake 启发的分布式 UUID 生成器

SnowUUID 简介:受 Snowflake 启发的分布式 UUID 生成器

Patricia Arquette
Patricia Arquette原创
2024-11-04 07:23:31857浏览

在分布式系统中,确保跨多个服务器或进程的唯一 ID 可能具有挑战性。 ID 必须是唯一的、快速生成的,并且有时还传达有关其来源的信息。受 Twitter 的 Snowflake ID 生成算法的启发,我开发了 SnowUUID,这是一个专为 Node.js 应用程序设计的分布式 UUID 生成器。 SnowUUID 结合了精度和可扩展性,生成独特的、按时间排序的标识符,可以针对任何分布式设置进行自定义。

为什么选择 SnowUUID?

SnowUUID 将 Twitter Snowflake 算法的强大功能融入到一个紧凑、易于使用的 npm 包中,供 JavaScript 开发人员使用。 SnowUUID 生成的每个 ID 都是 64 位整数,包含有关时间戳、数据中心、worker 和序列的信息,非常适合每个服务器或进程独立生成 ID 的分布式应用程序。

Introducing SnowUUID: A Distributed UUID Generator Inspired by Snowflake

SnowUUID的特点

  • 时间顺序 ID:ID 按时间顺序生成,确保它们可以按时间顺序排序。
  • 自定义选项:SnowUUID 允许配置数据中心和工作人员 ID,支持跨分布式系统的不同设置。
  • 高吞吐量:SnowUUID 具有每毫秒的序列限制,可以处理高吞吐量要求,防止 ID 冲突。

SnowUUID 的工作原理

SnowUUID ID 由多个段组成:

  1. 时间戳:确保 ID 按时间顺序排列。
  2. 数据中心ID:区分不同的数据中心。
  3. 工作人员 ID:区分数据中心内的不同工作人员。
  4. 序列:确保可以在同一毫秒内创建多个唯一ID。

以下是每个段的位分布细分:

Segment Bits Allocated
Timestamp 41 bits
Datacenter ID 5 bits
Worker ID 5 bits
Sequence Number 12 bits

用法

从 npm 安装 SnowUUID:

npm install snowuuid

要使用 SnowUUID 生成唯一 ID,请导入包并初始化新实例:

const { SnowUUID } = require('snowuuid');

// Initialize SnowUUID with options
const generator = new SnowUUID({
    epoch: 1609459200000n,  // Starting from January 1, 2021
    workerId: 1n,           // Unique ID for each worker
    datacenterId: 1n        // Unique ID for each datacenter
});

// Generate a unique ID
const uniqueId = generator.nextId();
console.log(uniqueId.toString());

自定义SnowUUID

SnowUUID 的 WorkerOptions 界面提供可自定义的设置以适应您的系统:

  • 纪元:自定义开始时间(以毫秒为单位)。
  • workerId:数据中心内每个工作人员的唯一标识符。
  • datacenterId:每个数据中心的唯一标识符。
const generator = new SnowUUID({
    epoch: 1610000000000n,  // Custom epoch
    workerId: 3n,           // Worker ID
    datacenterId: 2n        // Datacenter ID
});

底层:代码

SnowUUID 的核心是 nextId() 函数,它通过组合时间戳、数据中心 ID、工作 ID 和序列位来生成唯一 ID。其工作原理如下:

  • 时钟处理:该算法确保系统时钟始终向前移动。如果时钟倒退,则会抛出错误以防止重复 ID。
  • 序列溢出处理:当一毫秒内达到序列限制时,SnowUUID 会等待下一毫秒继续生成 ID。

示例代码:nextId 函数

nextId() {
    let timestamp = SnowUUID.now();

    if (timestamp < this.#lastTimestamp) {
        throw new Error(
            `Clock moved backwards. Unable to generate ID for ${this.#lastTimestamp - timestamp} milliseconds.`
        );
    }

    if (timestamp === this.#lastTimestamp) {
        this.#sequence = (this.#sequence + 1n) & SEQUENCE_MASK;
        if (this.#sequence === 0n) {
            timestamp = this.tilNextMillis(this.#lastTimestamp);
        }
    } else {
        this.#sequence = 0n;
    }

    this.#lastTimestamp = timestamp;

    return (
        ((timestamp - this.#epoch) << DEFAULT_TIMESTAMP_LEFT_SHIFT) |
        (this.#datacenterId << DEFAULT_DATACENTER_ID_SHIFT) |
        (this.#workerId << DEFAULT_WORKER_ID_SHIFT) |
        this.#sequence
    );
}

结论

SnowUUID 为分布式 UUID 生成提供了强大、可定制且高效的解决方案,非常适合需要跨多个系统的高可扩展性和唯一 ID 的应用程序。无论是用于分析、消息传递还是微服务,SnowUUID 都能确保唯一的、按时间排序的标识符,帮助您充满信心地进行扩展。

在 GitHub 上探索 SnowUUID:SnowUUID 存储库

以上是SnowUUID 简介:受 Snowflake 启发的分布式 UUID 生成器的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn