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

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

推薦する

エッジ コンピューティングとクラウド コンピューティング: 主な違いは何ですか?

エッジコンピューティングとクラウドコンピューティングの主な違いは何ですか?コンピューティングでは、「...

開発環境を繰り返し構築する必要はもうありません - Vagrant

新しい同僚が会社に入社するたびに、その同僚は自分のコンピューター上でさまざまな環境を構成する必要があ...

新しいウェブサイトの所有者が最初の月にやるべきこと

2か月間インターネットに熱心に取り組んで、成果が出始めました!Webサイト構築の最初の1か月で何をし...

2host-512M (xen) メモリ/50g ハードディスク/G ポート/無制限/月額 7 ドル

2009 年に設立された 2host は、現在 3,700 を超える顧客にホスティング サービスを提...

そもそもなぜzacブログの「seo」のランキングが安定しないのか?

検索エンジンのアルゴリズムの変更は、ウェブサイトのキーワードのランキングに影響を与えます。SEOはウ...

上位 6 つのコンテナ パイプラインの比較: 構成、利点、制限、価格

[51CTO.com クイック翻訳] ご存知のとおり、DevOps によってもたらされた大きな変化に...

Docker-Compose を通じて Elasticsearch と Kibana を素早くデプロイする

1. 概要Docker Compose を使用して Elasticsearch と Kibana を...

ユン氏による公開自己批判が話題に:私たちは信頼できない、ネットユーザー:わかっています!

​コンピレーション|影企画 |趙雲クラウドネイティブ時代において、信頼性の高いクラウド製品を選択する...

Alpharacks-DDoS 保護/$11/年/768MB メモリ/15GB ハード ドライブ/3TB トラフィック/ロサンゼルス/QuadraNet

alphaRacks の毎年恒例の夏の VPS プロモーションが始まりました。サーバー構成: マルチ...

kamatera: 香港の格安クラウドサーバー、1Gbpsの帯域幅、月額4ドルから​​、1Tのトラフィック

Kamatera は、現時点では香港で最も安価なクラウド サーバー (香港で最も安価な VPS) か...

クラスター、分散、マイクロサービスの類似点と相違点について簡単に説明します。

クラスターとは何かクラスタリングとは、複数のサーバーをまとめて、各サーバーが同じビジネスを実装し、同...

ハイブリッドクラウド市場をめぐる戦いが現実になる

ハイブリッドクラウドの使用がますます増えています。過去 10 年間でハイブリッド クラウド、市場構造...

ウェブプロダクトマネージャーが知っておくべき 5 つの SEO の秘密 - ウェブマスター情報およびサービス センター

あなたのウェブサイトの製品についてもっと多くの人に知ってもらいたい、そして本当に製品マネージャーを人...

検索マーケティングの基礎について

先週の金曜日、リード氏の招待を受けて、検索マーケティングセミナーで講演をしてきました。参加者はウェブ...