スノーフレークアルゴリズムを用いたID生成の解析と実践

目次

1 スノーフレークアルゴリズムとは何ですか?

構造

アドバンテージ

欠点がある

2 Javaでの使用

使用上の注意: 

テストコード

効果


1 スノーフレークアルゴリズムとは何ですか?

witter のスノーフレーク アルゴリズム。Snowflake ID は、分散システムで一意の ID を生成するニーズを解決するために設計された分散一意の ID 生成アルゴリズムです。

構造

Snowflake ID の構造は次のとおりです。

0 | 00000000000000000000000000000000000000 | 00000 | 00000 | 000000000000

- 最初のビット (最上位ビット) は符号ビットで、通常は 0 です。

- 次の 41 ビットはタイムスタンプで、ID が生成された時刻を記録するために使用されます。

-次に、さまざまなマシンを識別するために使用される 10 桁の作業マシン ID があります。

- 一般的に、現用マシン ID は現用ノード ID とデータセンター ID に分けられ、それぞれ 5 ビットを占めます。

 - 最後は 12 桁のシーケンス番号で、同じミリ秒内に生成された複数の ID の競合問題を解決するために使用されます。

この構造により、Snowflake ID は分散システム内で一意の順序付けされた ID を生成できます。

アドバンテージ

効率的で、トレンドが高まり、並べ替え可能で、外部のデータベースやネットワークに依存しません。

欠点がある

Snowflake ID アルゴリズムには、分散システムで一意の ID を生成する上で多くの利点がありますが、潜在的な欠点もいくつかあります。

1. マシン クロックへの依存: Snowflake ID のタイムスタンプ部分は、ID を生成したマシンのシステム クロックに依存します。マシンのクロックが設定されていなかったり、同期がずれていたりすると、生成された ID が一意でなくなったり、不正確になったりする可能性があります。

2. クロックのロールバックの問題: マシンのクロックがロールバックされると、生成された ID が以前に生成された ID よりも小さくなる可能性があります。これにより、特定のシナリオで並べ替えやインデックス付けが正しく行われないなど、潜在的な問題が発生する可能性があります。

3. 高い同時実行性でのシーケンス番号の重複: 同じミリ秒内に生成される ID リクエストの数が非常に多い場合、シーケンス番号の部分が一意性を保証するのに十分でない可能性があります。この場合、生成された ID の競合を解決するには追加の戦略が必要です。

4. スケーラビリティの制限: Snowflake ID の構造には作業マシン ID とデータセンター ID が含まれており、システムのスケーラビリティが制限されます。マシンまたはデータセンターの数を増やす必要がある場合は、ID 範囲を再割り当てするか、アルゴリズムを変更する必要がある場合があります。

5. ID の生成には単一のポイントが必要です。ID の一意性を確保するには、作業機械 ID とデータセンター ID を割り当てる集中型 ID ジェネレーターが必要です。これは、システムの単一障害点またはパフォーマンスのボトルネックになる可能性があります。

Snowflake ID アルゴリズムにはいくつかの欠点がありますが、ほとんどの場合、依然として実行可能で広く使用されている分散型一意 ID 生成スキームです。特定のアプリケーションのシナリオや要件に応じて、これらの欠点に対処するために、他の ID 生成アルゴリズムが考慮されたり、追加の対策が講じられたりする場合があります。

2 Javaでの使用

スノーフレーク アルゴリズムの実装に役立つ hutool ツールキットを直接使用しました。

頼る

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>


使用上の注意: 

作業マシン ID は作業ノード ID とデータセンター ID に分かれており、それぞれ 5 ビットを占めるため、作業者 ID とデータセンター ID の最大数は 31 です。

テストコード

    /** 测试 */
    public static void main(String[] args) {
        // workerID和datacenterId最大31
        Snowflake snowflake = IdUtil.getSnowflake(0, 31);
        for (int i = 0; i < 10; i++) {
            System.out.println(snowflake.nextId());
        }
    }

効果

Guess you like

Origin blog.csdn.net/qq_53679247/article/details/132651246