分散型グローバル一意 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 を使用する方法をご存知ですか?

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

推薦する

初心者はSEO技術に執着するべきではない

SEO をプレイすることは、オンライン ゲームをプレイするようなものです。ランキングが上がるたびに、...

abelohost-$6.95/KVM/1g メモリ/60g ハードディスク/100M 無制限/Windows

abelohost は、openvz と kvm 仮想化に基づく 2 種類の VPS を提供していま...

SEO検索エンジン最適化によりランキングが向上します

多くの SEO 担当者は、ウェブサイトのキーワードのランキングを非常に気にしており、これを利用して ...

ウェブサイトのおすすめ: SmartAsset は、どんな家が買えるか計算するのに役立ちます

SmartAsset: 購入可能な住宅の種類を計算するのに役立ちます家と車を買うことは多くの若者の目...

A5トピック:インターネットはMo Yanで熱く、さまざまなウェブサイトがトラフィックを競い合っている

莫言氏が中国人として初めてノーベル文学賞を受賞したことで、インターネットとはあまり関係のないこの作家...

ウェブサイト運営=SEO?

はじめに: 新しい Web サイトが立ち上げられ、すべてのプログラムと機能が準備されると、Web マ...

ホストハッチのブラックフライデープロモーションロサンゼルスVPSの簡単なレビュー

先日終了したHosthatchのブラックフライデープロモーションは、おそらく多くの人に深い印象を残し...

クラウドへの移行には隠れたコストがありますか?ユーザーは5つの落とし穴に注意する必要がある

クラウドに移行するかどうかは、もはや企業にとって選択肢ではありません。コンピューティング、ネットワー...

Baidu Netdisk の一時的なアップグレード?

今朝8時ごろから、Baidu Cloudにアクセス障害が発生し、ファイルリストが表示できず、ファイル...

天一雲:2021年上半期の売上高は140億元、前年同期比109.3%増

8月11日のニュースによると、最近、中国電信は2021年上半期の業績データを発表しました。データによ...

dedipath: (複数の) 専用サーバーのクリアランス、ロサンゼルス、1Gbps 無制限トラフィック、20G 防御、月額 55 ドルから (e3-1240v2/16g/2T/5IP)

ロサンゼルスのデータセンターにある Dedipath の独立サーバーが一掃されつつあり、損益分岐点の...

モバイル 3G マーケティングでは量が重要ですか?多様性、包摂性、アウトプットが鍵

企業にとって、インターネット マーケティングは馴染みのないものではありません。今日のインターネットの...

ウェブサイトのランキングに影響を与える要因は何ですか?

当社が最近遭遇した問題は、ウェブサイトの掲載順位が悪く、ランキングも良くなく、自社のウェブサイトのラ...

Kingsoft Cloud は、フルスタックのクラウド コンピューティング システムをアップグレードし、人工知能時代のクラウド「ヘルパー」となる

クラウドネイティブ、AIGC、ビッグモデルなどの新興技術の急速な発展により、インテリジェンスの時代が...