首頁 >web前端 >js教程 >SnowUUID 簡介:受 Snowflake 啟發的分散式 UUID 產生器

SnowUUID 簡介:受 Snowflake 啟發的分散式 UUID 產生器

Patricia Arquette
Patricia Arquette原創
2024-11-04 07:23:31921瀏覽

在分散式系統中,確保跨多個伺服器或進程的唯一 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