この記事は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 戦略
自動車小売業界では、デジタルモール、AI+小売、自動車スーパーマーケット、オムニチャネルマーケティン...
コンテナはマイクロサービスなどの単一の問題を解決するためによく使用されますが、実際のシナリオでは、問...
従来の電子商取引ウェブサイトでは、利益を上げるためにはマーケティング手法が非常に重要です。優れたマー...
A5ウェブマスターネットワークは8月16日、8月15日に電子商取引大手3社、JD.com、Sunin...
4月25日、百度ウェブマスタープラットフォームの李氏は「外部リンクの判定について」と題した発表を発表...
hostmada.com は 年に設立されたようで、ドメイン名登録、仮想ホスティング、VPS などの...
年末には、基本的に同じやり方で、驚くほど安い価格を提示し、OpenVZ を使って損切りなしで過剰販売...
最近、多くのメディアが、iOS版Alipayにセキュリティ上の脆弱性があると報じました。機内モードで...
国境を越えた交渉は今とても人気があります。最もがっかりした越境ビジネスは何ですか? 彼女が作った映画...
ソフト記事外部リンクは、SEO業界では高品質の外部リンクとして認識されています。まず、このタイプの外...
[[265739]]過去1年間、アリババとテンセントはともに経済環境の不確実性と、沈みゆく市場におけ...
2008年にタオバオがロボットプロトコルを使って百度のスパイダーをブロックしたという騒動は、その事件...
[[436665]]レプリケーション コントローラーは、ポッドのライフサイクルを管理し、必要な数のポ...
2 年前、オブジェクトおよびグラフ データベースのプロバイダーである Objectivity は、ク...
Fliphostは2周年を機にKVMベースのVPSをリリースしました。1Gと2Gのメモリは月額4ドル...