ホームページ  >  記事  >  ウェブフロントエンド  >  SnowUUID の紹介: Snowflake からインスピレーションを得た分散 UUID ジェネレーター

SnowUUID の紹介: Snowflake からインスピレーションを得た分散 UUID ジェネレーター

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-04 07:23:31859ブラウズ

分散システムでは、複数のサーバーまたはプロセス間で一意の ID を確保することが困難になる場合があります。 ID は一意で、迅速に生成される必要があり、場合によってはソースに関する情報を伝える必要があります。 Twitter の Snowflake ID 生成アルゴリズムに触発されて、私は Node.js アプリケーション用に設計された分散 UUID ジェネレーターである SnowUUID を開発しました。 SnowUUID は、精度とスケーラビリティを組み合わせて、あらゆる分散セットアップに合わせてカスタマイズできる、時間順に並べられた一意の識別子を生成します。

なぜ SnowUUID なのか?

SnowUUID は、Twitter の Snowflake アルゴリズムの能力を、JavaScript 開発者向けのコンパクトで使いやすい npm パッケージに組み込みます。 SnowUUID によって生成される各 ID は 64 ビットの整数であり、タイムスタンプ、データセンター、ワーカー、シーケンスに関する情報が含まれているため、各サーバーまたはプロセスが個別に ID を生成する分散アプリケーションに最適です。

Introducing SnowUUID: A Distributed UUID Generator Inspired by Snowflake

SnowUUIDの特徴

  • 時間順 ID: ID は時間順に生成され、時系列に並べ替えることができます。
  • カスタマイズ オプション: SnowUUID を使用すると、データセンター ID とワーカー 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。