分散型グローバル一意 ID スキームはそんなにたくさんあるのでしょうか?

分散型グローバル一意 ID スキームはそんなにたくさんあるのでしょうか?

[[403814]]

この記事はWeChatの公開アカウント「Java Geek Technology」から転載したもので、著者はYaxue Fansです。この記事を転載する場合は、Java Geek Technology の公開アカウントにお問い合わせください。

以前、Afen は、社内にすでに存在する分散システム内の固有 ID を最適化する方法について考えていました。固有 ID について言えば、従来の業界に従事していない人であれば、分散アーキテクチャでは、固有 ID 生成ソリューションは、特にデータベースがシャーディングを使用する場合に、システムを設計するときによく遭遇する問題であるということをご存知だと思います。特に、データベースをシャードした後は、この一意の ID に対する要件がますます高くなります。では、固有 ID ソリューションとは何でしょうか?

分散型グローバルユニークID

配給について話すとき、人々はいつも怖がります。なぜなら、多くの面接で「配給できますか?」と聞かれるからです。プロジェクトのアーキテクチャはどのように行われ、どの程度うまく行われていますか?分散を使用する場合、分散トランザクションをどのように処理しますか?分散されたグローバルに一意の ID を実装するためにどのようなアルゴリズムを使用していますか?

多くの場合、このことについて話すと、面接を受けている多くの友人は恥ずかしさを感じます。私はそれを直接使用するだけであり、それにまったく注意を払ったことはないと思います。これに気づくと、次の質問に答えるときにつまずき始め、面接に失敗してしまうことがよくあります。

システムの同時実行性が高くなるほど、データが大きくなります。データが大きくなればなるほど、分散化が必要になります。大量の分散データを識別するには、一意の識別子が必要です。これらのグローバルに分散された一意の識別子を一意の ID と呼びます。

Redisはグローバルに一意のIDを実装する

正直に言うと、Afen のプロジェクトは特に悪いわけではありません。そこで、Ah Fan は、分散グローバル一意 ID を生成するときに、なぜ UUID または自動増分主キーを使用するのか疑問に思い始めました。

そこで、Ah Fen は Redis を使用して分散型グローバル一意 ID を生成することを計画しています。

Redisはグローバルに一意なIDの原則を実装している

すべての Redis コマンドはシングルスレッドであるため、Redis のアトミック操作 INCR および INCRBY を使用して、グローバルに一意の ID を生成できます。方法 1: StringRedisTemplate

  1. パブリッククラスアクティビティ{
  2. プライベートな Long ID;
  3. プライベート文字列;
  4. プライベート BigDecimal 価格;
  5. }

上記は私たちのアクティビティのエンティティ クラスです。 618がもうすぐ登場します。電子商取引を行っている皆さんは、何かする準備はできていますか?学んで試してみることができます。アクティビティには、ID、アクティビティの名前、対応するアクティビティに設定された価格などが含まれます。他にも多くのフィールドがある可能性がありますが、ここではこれらのフィールドのみをリストします。

  1. パブリッククラスIdGeneratorService {
  2. オートワイヤード
  3. プライベート StringRedisTemplate stringRedisTemplate;
  4.  
  5. プライベート静的最終文字列 ID_KEY = "id:generator:activity" ;
  6.  
  7. パブリックLong incrementId() {
  8. stringRedisTemplate.opsForValue().increment(ID_KEY)を返します
  9. }
  1. 長い id = idGeneratorService.incrementId();生成するには呼び出してください

でもいつも少し低く見えますよね?もう少し高級感を出す準備をした方が良いでしょうか?結局のところ、コードはプログラマーの下着のようなものです。穴があいていても問題ありませんが、他人に見られると非常に不快なことになります。だから、もう少し高級感を出す必要があります。

方法2:

なぜ2番目の解決策があるのでしょうか?これは、Redis には 1 つの Redis だけではなく、クラスターが存在することが多いためです。クラスターなので、無理なく使い始めなければなりません。

次に、クラスターの知識を考慮し始める必要があります。そうすれば、アイデアが得られます。つまり、クラスター内の各ノードは生成された ID を事前に生成します。次に、それを Redis 内の既存の ID と比較します。大きい場合は、ノードによって生成された ID が使用されます。小さい場合は、Redis の最大 ID を使用して増分されます。

このとき、実装する ID が一意であることを確認するための lua スクリプトも必要です。これが本当の本質です。そうしないと、実装する ID はハイエンドであり、一意ではありません。

コアスクリプト:

  1. 地元 関数get_max_seq()
  2. 地元 キー= tostring(KEYS[1])
  3. ローカルインクリメント数 = tonumber(KEYS[2])
  4. ローカルシーケンス = tostring(KEYS[3])
  5. ローカルの月単位の秒数 = 24 * 60 * 60 * 30
  6. 1 == redis.call(\ 'setnx\' , key , seq)の場合
  7. それから 
  8. redis.call(\ 'expire\' ,キー, month_in_seconds)
  9. シーケンスを返す
  10. それ以外 
  11. ローカルprev_seq = redis.call(\ 'get\' ,キー)
  12. (前のシーケンス < シーケンス)
  13. それから 
  14. redis.call(\ 'set\' キー、シーケンス)
  15. シーケンスを返す
  16. それ以外 
  17. --[[  
  18. 返される値は浮動小数点数型であり、不正確である可能性があるため、 redis.call(\ 'incr\' , key ) を直接返すことはできません。
  19. 注意: 「16081817202494579」の数値サイズは、lua と reids の最大値を超えようとしています。 seq ビットの数を増やす場合は注意してください。
  20. --]]  
  21. redis.call(\ 'incrby\' キー、incr_amoutt)
  22. redis.call(\ 'get\' , key )を返します
  23. 終わり 
  24. 終わり 
  25. 終わり 
  26. get_max_seq()を返す

上記の Lua スクリプトはブロガーの Ydoing によるものです。グローバルに一意な ID を生成するためにこれを使用するので、分散型グローバルに一意な ID を実装するために Redis を選択する理由を理解する必要があります。

すべてのRedisコマンドはシングルスレッドです

前の段落の冒頭で、Ah Fen は Redis コマンドはすべてシングルスレッドであると述べました。これを面接官の前で言うと、面接官は間違いなく「なぜ Redis はマルチスレッドではなくシングルスレッドなのですか?」と尋ねると思います。

Redis は、Reactor モードに基づいて、ファイル イベント プロセッサと呼ばれるネットワーク イベント プロセッサを開発しました。その構造は、複数のソケット、IO マルチプレクサ、ファイル イベント ディスパッチャ、およびイベント ハンドラの 4 つの部分で構成されます。ファイル イベント ディスパッチャ キューの消費はシングル スレッドであるため、Redis はシングル スレッド モデルと呼ばれます。

Reactor モードについて話すとき、Netty モデルを詳細に研究したことがあるなら、このモードが Netty でも使用されていることがわかります。確認するには公式サイトに行く必要がありますか?なぜそう言うのでしょうか?

リアクターモデルとは何ですか?

ご存知のとおり、Reactor モデルは多重化された I/O モデルであり、主に高同時性、高スループット環境での I/O 処理に使用されます。

この多重化モデルは、常にイベント ディストリビュータ、イベント ハンドラ、および呼び出しクライアントという同じいくつかの要素に依存します。

Reactor モデルは同期 I/O 多重化モデルです。他のモデルを見る前に、まずこの同期 I/O 多重化モデルを理解しましょう。

あなたはこれについてあまりよく知らないと思います。 Afen は以前、Netty の Channel についても話していました。記事のアドレスをお送りします。ソケットでプログラミングしますか?私はやはりNettyを選びました。この記事では、チャンネルについて説明しました。このシングルスレッドモデルはどのようなものですか?

この絵はあなたのために描かれました。ちょっと醜いですが、意味は伝わります。

このモデルでは、Redis がシングルスレッドであるということは、ネットワーク要求モジュールが 1 つのスレッドを使用する (したがって、同時実行の安全性を考慮する必要がない) ことを意味します。つまり、1 つのスレッドがすべてのネットワーク要求を処理し、他のモジュールは引き続き複数のスレッドを使用します。

面接官は、Redis を使用するとなぜ高速になるのかについても質問します。

この質問には誰でも答えられると思います。Redis はメモリベースのデータストレージなのに、なぜメモリが高速なのでしょうか?

この速度はディスクに保存されたデータに対するものです。停電後、メモリ内のデータは消失します。次回来るときには、やはりディスクから読み込んで保存する必要があります。これがRedisが高速な理由です。話がそれてしまいましたが、Redis のシングル スレッドについての話に戻りましょう。

公式サイトの説明を見てみましょう。

  1. Redisシングルスレッドです複数の CPU / コアを活用するにはどうすればよいですか?
  2. 通常、Redisメモリまたはネットワークにバインドされているため、CPU が Redisボトルネックになることはあまりありませんたとえば平均的な Linux システム実行されるパイプライン Redis を使用すると、1あたり 100 万件のリクエストも処理できるため、アプリケーションが主に O(N)またはO(log(N)) コマンドを使用する場合、 CPU を過度に使用することはほとんどありません
  3.  
  4. ただし、 CPU 使用率を最大化するには、同じボックス内でRedis複数のインスタンスを起動しそれらを異なるサーバーとして扱うことができます。 いずれにしても、 1つのボックスでは十分ではなくなる可能性があります。複数のCPUを使用する場合は、次の点を検討してください。  早めシャードする方法
  5.  
  6. 複数の Redis インスタンスの使用に関する詳細については、パーティショニング ページ参照してください。
  7.  
  8. しかし、 Redis 4.0では、Redis のスレッド化さらに進みました。今のところ、これはバックグラウンドでのオブジェクトの削除限定されており  Redis モジュール経由で実装されたコマンドをブロックします今後のリリースでは   Redis をさらにスレッド化します

実際、この翻訳は、Redis を使用する場合、Redis は通常メモリまたはネットワークが制限されているため、CPU がボトルネックになることは一般的ではないことを意味します。

実際、率直に言えば、公式ウェブサイトでは、Redis は非常に高速であり、シングルスレッド モードでもすでに非常に高速であるため、マルチスレッドを使用する必要がないと述べています。これはちょっと気持ち悪いですね。アーフェン氏も自身の見解を述べた。結局のところ、公式サイトの言葉は少し誤解を招くものです。

実際、Redis はメモリをバインドするために単一の CPU を使用し、メモリの処理はシングルスレッドで行われます。複数のスレッドをシミュレートするために複数の CPU を使用します。複数の CPU を切り替えて Redis を操作するのは、実際にはメモリから直接取り出すよりも効果的ではありません。結局、時間がかかります。

Redis がシングルスレッドである理由は何だと思いますか?

<<:  Kubernetes で Jenkins を使用する方法をご存知ですか?

>>:  フレームワーク: 分散一貫性ソリューション

推薦する

医療ウェブサイトの最適化手法の変革で遭遇したボトルネックに関する経験の共有

中国の現在の医療状況では、医師の診察を受けることがますます困難かつ高額になっており、またインターネッ...

盛業2022中間決算:「産業インターネット」分野の事業は約15倍に成長、国有企業の合弁協力モデルが今後の成長を牽引

最近、大手サプライチェーン技術プラットフォームである盛業ホールディングスグループ株式会社(以下、「盛...

クラウド コンピューティングにとって継続的な可用性が重要なのはなぜですか?

今日、ほぼすべての企業組織が何らかの形でクラウド コンピューティングを使用しています。これらの取り組...

A5 Yuehuai: スパムリンクと戦い、ソースを捕捉 Baidu アルゴリズムは輸出リンクをターゲットに

10月23日、百度のアルゴリズムが再びアップグレードされ、ハイパーリンクの不正操作によって百度の検索...

Digital-VM: 50% オフ、月額 3 ドルから、最大 10Gbps の帯域幅、512M メモリ/1 コア/30g SSD/5T トラフィック

digital-vm は年末のスーパープロモーションを開始しました。すべての VPS が 50% オ...

SaaS: 急成長を遂げる高品質なクラウドコンピューティングトラック

ガートナーによると、世界のクラウドコンピューティング市場規模は2020年までに4,114億米ドルに達...

chicagovps-10USD/windows/4GB RAM/100GB SSD/4TB トラフィック/2IP

chicagovps.net の遅れたクリスマス プロモーションはまだ有効です。40% オフの割引コ...

cloudcone: Black 5 の先行販売、安価な大容量ハードディスク VPS、最低 $14.2/年、ロサンゼルス MC データセンター

Cloudcone はブラックフライデーのプレコレクションを開始し、KVM 仮想化 + HDD RA...

AI支援による医療診断と遠隔診療で何百人もの命が救われる

[51CTO.comからのオリジナル記事] 専門的で経験豊富な医師の不足と良質な医療資源の集中により...

ikoula、E3-1220V5/16g メモリ/1T ハードディスク/100M 無制限トラフィック

ikoula は、非常に優れた構成条件と安価な価格の特別なサーバーを立ち上げました。ご興味があれば、...

アリババがKuPan個人向けクラウドストレージサービスを停止

「絶対に失われない高速な個人用クラウドストレージ」をうたうアリババのCoolPanは、2015年10...

spinservers: 月額 99 ドル、2*e5-2630L v2/64g メモリ/4*2T ハードディスク/10Gbps 帯域幅、ダラス、米国

spinservers データ センターでは、いくつかの新しい「インスタント サーバー」モデル (3...

タオバオストアの購買転換率に影響を与える致命的なポイント

少し前、多くの淘宝網の販売業者が張立氏を見つけ、自分の店舗の状況を調べるのを手伝ってほしいと頼んだ。...

5月の第3週には、中国の.COMドメイン名の総数は700万に達し、純増は5万以上となった。

IDC Review Network (idcps.com) は 5 月 26 日に次のように報告し...