この記事は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 戦略
これはおそらく、史上最も包括的なオンライン運営およびプロモーションチャネルであると信じています。起業...
クラウド コンピューティングの導入により、企業の運営方法が近代化されました。このテクノロジーにより、...
[[262976]] 1. 背景生放送元年を迎え、春雨後の竹の子のように生放送作品が次々と登場してい...
インターネット企業は、ネットユーザーが毎日利用し、そのサービスにはより高い広報能力が求められる百度、...
[[421799]]この記事では、エッジ コンピューティング システムをコンポーネントと概念分析の ...
私、Ni Yeming を含め、ウェブサイトを構築する前に、なぜウェブサイトを構築したいのかをはっき...
Huawei Connect 2021が9月23日に開幕した。「アプリケーション近代化の旅を開始し、...
Alibaba Cloud が IBM Cloud Paks サードパーティ エコシステムに参加[[...
現在、HAT が率いるクラウド コンピューティング ベンダーは「クラウド」戦争を繰り広げています。感...
6月3日午後のA5ウェブマスターネットワークニュース:今日の午後、皆さんのBaidu検索は正常だった...
微博アカウント@互联网那个点事によると、8684が所在する広州天局ネットワークテクノロジー株式会社は...
最近の namecheap のプロモーションは本当に素晴らしいです。ドメイン名 1 つあたり 3.9...
クラウド コンピューティングの人気は高まり続けていますが、競争で優位に立つためには、2020 年にク...
みなさんこんにちは、kinessです。今回はフレンドリーリンクがキーワードランキングに与える影響につ...
確かにウェブサイトの SEO 最適化に関する記事は数多くありますが、大規模ポータルサイトの SEO ...