この記事はWeChatの公開アカウント「Java Geek Technology」から転載したもので、著者はYaxue Fansです。この記事を転載する場合は、Java Geek Technology の公開アカウントにお問い合わせください。 序文まず、分散 ID が必要な理由と、分散 ID を使用して解決する問題について説明します。私たちのプロジェクトがまだモノリシック アーキテクチャだった頃は、データベースの自動増分 ID を使用して、多くのデータ識別の問題を解決できました。しかし、ビジネスが発展するにつれて、私たちのアーキテクチャは徐々に分散アーキテクチャへと進化していきます。現時点では、ビジネスのデータは複数のデータベースに保存される可能性があるため、データの自己増分 ID を使用することはできません。このとき、データを識別するには分散 ID が必要なので、分散 ID 生成サービスが必要になります。では、分散 ID サービスの要件と課題は何でしょうか? 必要とするグローバルに一意: データを一意に識別するために使用されるため、分散 ID はグローバルに一意であり、同じビジネスのすべてのサービスで一貫している必要があります。これは基本的な要件です。 グローバル増分:増分も分かりやすいです。多くの場合、ID は人が見るためのものであるため、生成された ID が順番に増加していくことを確認する必要があります。増分しない場合は、読みやすさが大幅に低下します。 情報セキュリティ:分散IDのセキュリティも非常に重要です。前述したように、生成された ID は増分的であるため、競合他社が ID 生成の頻度を知ることができる可能性があります。これは電子商取引やその他のシナリオでは大きな問題を引き起こしますが、これは世界的な増加と矛盾することがよくあります。 高可用性: 分散 ID 生成サービスは高可用性を備えている必要があります。結局、ID を生成できなければ、その後のすべてのサービスが使用できなくなります。 一般的な分散ID実装今日のインターネットでは、ビジネス シナリオとニーズに応じて、分散 ID を実装する方法がいくつかあります。
言語 Java を書く友人は UUID に精通している必要があります。 7dbb9f04-d15e-4c88-b74b-72a35e0d7580 は標準の UUID です。 UUID はグローバルに一意であり、前述の最初の要件を満たしていると言われていますが、明らかにグローバル増分はありません。この分散 ID は読みやすさが悪いです。ログ記録や人間の理解を必要としないシナリオにのみ使用する場合は使用できますが、ここで説明しているビジネス データの一意の識別には適していません。さらに、この順序付けられていない UUID を主キーとして使用すると、パフォーマンスに重大な影響を及ぼします。 レディス Redis には incr コマンドがあり、アトミックな増分を保証し、ある程度のグローバル ID を生成できます。ただし、Redis の使用には 2 つの問題があります。
データベース自動増分ID 先ほど、分散環境内の単一のデータベースでは、各 MySQL インスタンスの自動インクリメント ID が 1 から始まり、ステップ サイズが 1 ずつ増加するため、自動インクリメント ID を使用できなくなったことを説明しました。この場合、データベースごとに異なるステップ サイズを設定することを検討するのは簡単です。異なるステップ サイズを設定すると、各データベース インスタンスが重複することなく ID を生成できるようになります。シンプルなシステムをこのように使用することもできますが、いくつか問題があります。 データベースへの依存。分散環境では、データベースに過度に依存することはリスクがあり、特に 1 秒あたり数十万 QPS の電子商取引トランザクション シナリオでは、高い同時実行性をサポートできません。 異なるデータベース インスタンスのデータは直接リンクできず、データを連結するには追加のストレージが必要になるため、ビジネスの複雑さが増します。 Twitterのスノーフレークアルゴリズム スノーフレーク アルゴリズムは、Twitter のオープン ソース分散 ID 生成アルゴリズムです。このアルゴリズムは標準的な考え方を提供します。多くの企業がこのアルゴリズムに基づいて独自の実装を行っています。最も有名なのは美団の葉です。ここでは、スノーフレーク アルゴリズムがどのように実装されるかに焦点を当てます。 ご興味がございましたら、https://tech.meituan.com/2017/04/21/mt-leaf.html の記事を参照して、Meituan の leaf の実装原理をご確認ください。 スノーフレーク アルゴリズムの考え方は、全体を部分に分割し、分散 ID の生成を各コンピューター ルームとマシンに分散させることです。 ID を表すために 64 ビットの long 型構造体が使用されます。 64 ビット構造を以下に示します。最初の符号ビットは 0 で、その後に 41 ビットのタイムスタンプが続き、次の 10 ビットはコンピュータ ルームとマシン、最後の 12 ビットはシリアル番号です。 上記の構造は、スノーフレーク アルゴリズムの基本構造です。各社は自社の事業内容に応じて適宜調整を行っていきます。 32 ビットやその他のビットを使用でき、実際の状況に応じてタイムスタンプのビット数を調整することもできます。 10 ビットの workerID は、コンピュータ ルームがある企業の場合はコンピュータ ルームとマシンで構成でき、コンピュータ ルームがない企業の場合はマシンを直接使用できます。状況に応じてシーケンスビットも適切に調整できます。 簡単な計算ができます。 41 ビットの時間は 2 ^ 41 / (365 * 24 * 3600 * 1000) = 69 年です。各マシンは 1 ミリ秒あたり 2 ^ 12 = 4096 個の ID を生成できます。 つまり、私たちのコードは 69 年間しか実行できないということですか?実はそうではありません。サービスは開始時に初期値を設定します。ここでのタイムスタンプは、マシン時間と初期値の差です。では、SnowFlake アルゴリズムの利点と欠点は何でしょうか?
上記の原則を組み合わせることで、Java コードを通じて実装できます。コードは次のとおりです。
参照する 知乎:9つの分散ID生成方法が一気に語られ、面接官は少々困惑した Leaf - 美団点評分散ID生成システム |
<<: 基本概念、アーキテクチャ、新バージョンへのアップグレード - Kafka 知識システム (I)
>>: クラウド ネイティブ 2.0: 今検討すべき 3 つの DevOps 戦略
Hostkvmは、ロシアのcn2 giaネットワークのVPS帯域幅を30Mから150Mbpsに無...
最近、「福州100%事件」と「温州百業連盟事件」が各界から大きな注目を集めています。 両事件とも、リ...
【平安クラウド金融業界ソリューション】 [51CTO.com からのオリジナル記事] クラウド コン...
小紅書はオフライン店舗を閉鎖した。 「金融グラフィティ」の報道によると、小紅書は最近、上海のオンライ...
アマゾンは、先進国のほとんどに商品を配送する世界的な電子商取引帝国を築き上げ、その過程で分散コンピュ...
IDC は、今年最も大きな投資が見られた 3 つのユースケースとして、コンテンツ配信ネットワーク、仮...
世界インターネット会議が開催され、有名なインターネット界の巨人たちが、FacebookやTwitte...
技術が急速に変化しているこの時代では、新しい製品が古い製品に取って代わる例が多くあり、以前人気があっ...
CITICの会員企業である中国企業ネットワーク通信技術有限公司(「China Entercom」)は...
OpenStack は 2010 年から 8 年間オープンソース化されてきました。主流のエンタープラ...
コンピュータは数百マイル離れていますが、遅延はわずか数ミリ秒です。オフィス アプリケーションの場合、...
spryserversはHostcatに2度登場しており、主に米国フェニックスとダラスのデータセンタ...
80年代以降の世代は中国のネット消費の屋台骨だが、90年代以降の世代の消費力も追い上げている。一人当...
ガートナーの予測によると、世界のパブリッククラウドサービス市場は2019年の2,427億ドルから20...
共に創造し、共に前進し、長期的な価値志向を堅持し、ウィンウィンと共存を実現し、共にウィンウィンの産業...