[51CTO.com オリジナル記事] 古代の皇帝はハーレムに3000人の美女を抱えていたことは誰もが知っていますが、皇帝は当然、すべての人を平等に扱う精神を持ち、一人だけを優遇することを望まなかったのです。
画像はPexelsより 川は三千もあるのに、どうしてその一つだけしか飲めないのか。皇帝は夜寝るときに寒さを恐れ、毎晩一緒に寝てくれる人が必要だったという。それでは、後宮にこんなに多くの側室がいる場合、誰を選び、寝る場所の数をどのように割り当てるべきだろうか。 皇帝がセックスにこだわっていたのも不思議ではありません。早くも『春秋実録』には、「陰病を隠して明るい噂を流せば、六気を防いで心臓病を治せる」と記されています。 九人の側室の下では、九人に一人が皇帝と性交する。八十一人の側室は九夜、二十七人の女性は三夜、九人の側室は一夜、三人の妻は一夜、合計十四夜、そして皇后は一人で一夜、合計十五夜。月の前半は上記のように配置され、月の満ち欠けに応じて、月の後半は16日から皇后、九妾、側室、側室の順に始まります... さまざまな王朝の皇帝は、側室を寵愛する方法がそれぞれ異なっていました。有名なものとしては、羊の荷車の中で寵愛を待つ、サイコロを振って皇帝と寝る、蝶で皇帝を寵愛する、トランプをめくる、提灯を吊るす、などがあります。 しかし、私の意見では、皇帝が負荷分散アルゴリズムを理解していれば、それほど多くのことをする必要はありません。一連のアルゴリズムで、一生眠っている問題を処理できます。そのため、今日は、よく使用される負荷分散アルゴリズムとコード実装をいくつか紹介します。 まず記事の概要を見てみましょう:
ポーリングアルゴリズム 歴史の記録によると、乾隆帝は生涯で42人の側室を持っていたが、その中には長江の南方に行った際に大明湖に滞在した夏玉和ら他の者も含まれていない。
ある時期、皇帝の寵愛する側室が霊妃、献妃、高妃、淳妃であったとします。一般的なポーリング アルゴリズムをどのように選択しますか? まず、妾セットを次のように定義します。
次に、リストから寝室で皇帝に仕えている側室に投票し、変数インデックスを使用して投票順位を記録します。
出力結果は投稿されません。このアルゴリズムの特徴は、シンプル、シンプル、シンプルです。しかし、大きな欠点もあります。 皇帝が凌妃をより寵愛し、彼女と寝るチャンスを増やしたいとしたらどうでしょうか? その場合は、次の重み付け投票アルゴリズムを使用する必要があります。 加重ラウンドロビン 加重ラウンドロビンは、各妾に対して主観的に優先値(重み値)を設定し、選択される確率を制御するため、次の構成を定義する必要があります。
ここでの構成はもはや単純なセットではありません。各妾には対応する重み値があります。投票中にこの値に応じて選択される確率を高めるにはどうすればよいでしょうか。 以下では、3 つの一般的な実装について説明します。 重み付けラウンドロビンの実装 私たちのアイデアは、このマップのキー (妾) を重み値に応じてリストに転送し、このリストをポーリングすることです。重み値が 5 の場合、5 つの同一レコードをリストに追加します。 次に、このリストを走査します。重みの値が高いほど、リストに表示される可能性が高くなり、ポーリングされる可能性が高くなります。
出力は次のようになります。 加重ラウンドロビン アルゴリズムは比較的単純で、実装も簡単です。しかし、問題もあります。設定した重みの値は 5、1、3、2 です。これを 50、10、30、20 に設定することもできますか? 上記の方法によると、何百もの同じ要素をリストに入れる必要があるのでしょうか? これは明らかに不合理であり、メモリを大量に消費します。 加重ラウンドロビン実装 2 上記のアルゴリズムの問題に基づいて、類似の比率アプローチを使用して対処することを検討します。 たとえば、設定した重みの値が 50、10、30、20 の場合、水平軸では 0_____50_60__80__110 と表されます。 投票位置を記録するために、インデックスを使用します。インデックスが 0 から 50 の間であれば、最初の妾が選択されていることを意味します。50 から 60 の間であれば、2 番目の妾が選択されていることを意味します。 具体的なコード実装を見てみましょう。
出力は上記の方法とまったく同じです。 この加重ポーリング アルゴリズムは最初のものよりも少し複雑ですが、これら 2 つの実装に共通する問題は、現在の構成によれば、霊妃を 5 回連続でポーリングし、次に仙妃を 1 回、次に高妃を 3 回ポーリングすることになるということです... 5回連続!皇帝が霊妃を愛していたとしても、耐えられないでしょう!コンピューター的には、負荷があまりバランスが取れていません! 加重ポーリングの実装 3 (スムーズ加重ポーリング) スムーズな重み付けポーリング アルゴリズムは、上記の負荷不均衡の状況を解決するために設計されています。このアルゴリズムの実装は比較的複雑です。 各妾には、重量値 (weight) だけでなく、計算を支援するために変化する動的重量値 (dynamicWeight) もあります。 動的重み値の計算ロジックは次のとおりです。
これはあまり明確ではないかもしれないので、次の構成がまだあると仮定して計算してみましょう (構成には側室の名前と対応する重み値のみが含まれます)。
上記の構成では、合計重量値 totalWeight=5+1+3+2 は 11 になります。 ① 上記のアルゴリズムの最初のポイントによれば、ターゲットの最初のポーリングの前は、dynamicWeight は 0 です。 したがって、4人の妾のweightとdynamicWeightの値は次のようになります。 ② 上記アルゴリズムの2番目のポイントによれば、最初のポーリングでターゲットが選択された場合、dynamicWeight=dynamicWeight+weightとなります。 変更後、4人の妾のweightとdynamicWeightの値は次のようになります。 ③上記アルゴリズムの3番目のポイントに従って、最大のdynamicWeightが5であることがわかるので、最初のポーリングではリン皇妾が選択されます。 ④上記アルゴリズムの4番目のポイントに従って、TotalWeightからConcubine LingのdynamicWeightを減算する必要があります。 変更後、4人の妾のweightとdynamicWeightの値は次のようになります。 次に、2 回目のポーリング中に、アルゴリズムの最初のポイントに従って dynamicWeight を設定する必要があります。 最後の 4 つの妾の weight と dynamicWeight の値を次のように設定します。 アルゴリズムはこのように処理を続けます。11 回のポーリング後、すべての妾の dynamicWeight は再び 0 になります... まだ少し混乱している場合は、コードのみをお見せします。まず、各妾とそれに対応する weight および dynamicWeight 属性を格納するためのエンティティを定義する必要があります。
次に、オブジェクトを格納するための 2 つのグローバル オブジェクトを定義します。
次にアルゴリズムを実装します。
最終的な出力は次のようになります。 11回の投票後、霊公妃も5回登場しましたが、以前のアルゴリズムのように連続して登場することはないことは明らかです。以前のアルゴリズムの方がはるかにバランスが取れています!!! それでも理解できない場合は、記事の最後にあるGithubアドレスからコードをダウンロードして、自分でデバッグして理解することができます。 ランダム化アルゴリズム 滑らかな重み付けポーリングアルゴリズムは、負荷を非常にうまく処理できます。しかし皇帝は再び言いました、ポーリングアルゴリズムによれば、私は毎晩私と一緒に寝る側室を計算できます。まったく面白くありません。 皇帝に関しては、常に何か新しいものや刺激的なものが好きだということは理解できます。幸いなことに、この問題を解決するためのランダム アルゴリズムがあります。毎晩ランダムに 1 つ選択されるため、皇帝は事前に推測できず、十分な興奮を味わうことができます。 私たちは、妾セットを次のように定義します。
次に、ランダム関数を使用してターゲットを選択します。
出力はランダムなので、ここには掲載しません。ポーリング アルゴリズムを理解していれば、ランダム アルゴリズムも簡単に理解できます。ポーリングでは、各ループの位置を保存するためにグローバル インデックスが使用されますが、ランダムでは、値が毎回ランダムに生成されます。 重み付きランダムアルゴリズム 重み付けランダム実装 重み付きランダム実装 1 の考え方は、上記の重み付きポーリング実装 1 とほぼ同じです。コードを直接示します。
加重ランダム実装 II 重み付きランダム実装 2 の考え方は、上記の重み付きポーリング実装 2 とほぼ同じなので、コードをそのまま示します。
送信元アドレスハッシュアルゴリズム 私たちの仕事でよく求められるのは、システムにアクセスする前にログインすることであり、これにはセッションが含まれます。 セッションを共有しない場合、ログイン後のセッション情報は、ログイン インターフェイスを呼び出すサーバー上にのみ存在します。 以前のポーリング アルゴリズムまたはランダム アルゴリズムによれば、同じクライアントからの複数の要求が異なるサーバーに送られ、その結果、一部のインターフェイスにアクセスできなくなります。 したがって、同じクライアントからの複数のリクエストが同じサーバーに届く必要があります。ここでの一般的なアプローチは、ソース アドレスをハッシュすることです。 この時点で、私たちは皇帝に休憩を与え、通常のビジネスシナリオに戻らなければなりません。次のようなサーバー構成があるとします。
また、クライアントがアクセスする IP アドレスのセットもシミュレートしました。
送信元アドレス ハッシュ アルゴリズムの考え方は、クライアントの IP をハッシュし、ハッシュ値とサーバーの数を法として、アクセスする必要があるサーバーの IP を取得することです。クライアント IP が変更されない限り、ハッシュ値は固定されます。 実装は次のとおりです。
最終的な出力は次のようになります。 こうすることで、何度実行しても、同じクライアント IP 要求によって取得されるサーバー アドレスは同じになります。 この実装はシンプルですが、脆弱でもあります。サーバーの数は変わる可能性があるため、今日マシンをオフラインにして、明日マシンを追加することはよくあります。 サーバーの数が変わると、送信元アドレスハッシュのモジュロ値が変わる可能性があり、取得されるサーバー IP も当然変わります。 たとえば、サーバーから 192.168.4.10 のマシンを削除すると、次の出力が表示されます。 出力結果を比較すると、影響はほぼグローバルであることがわかります。では、サーバーの数が変わっても影響を受けるクライアントの数を減らすことができるソリューションはありますか? これには、次の一貫したハッシュ アルゴリズムが必要です。 一貫性のあるハッシュアルゴリズム 重み付けポーリング アルゴリズムの 2 番目の実装では、重み値を水平軸表示に変換することについて説明しました。ここでも同じ考え方を使用できますか? クライアント IP がハッシュ化された後、それは int32 数値になります。次に、int32 数値を複数のセグメントに分割し、各サーバーが 1 つのセグメントのリクエストを担当するようにします。 わかりやすくするために、上記のように、サーバー 192.168.2.10、192.168.2.20、192.168.2.30、192.168.2.40 をそれぞれ IP1、IP2、IP3、IP4 で表します。
ただし、より専門的な表現では、以下に示すように、水平軸を曲げてハッシュ リングと呼ばれるリングを形成します。 これはより直感的です。ある日 IP4 サーバーがダウンした場合、元々 IP4 に送信する必要があったすべてのリクエストは、処理のために IP1 サーバーに転送されます。 これは依然として一部のクライアント要求に影響を及ぼしますが、少なくとも影響はローカルのみです (次の図を参照)。 これで十分でしょうか? 次の 2 つの質問について考えてみましょう。
問題 1 の解決策は、ノードの位置を手動で割り当てるのではなく、サーバーの IP に基づいてハッシュ値を計算し、ハッシュ値がリング上のどこに該当するかを確認することです。 これに関する問題の 1 つは、各クラスターのサーバー IP が異なるため、計算後のリング上の位置が制御不能になる可能性があることです。 計算後の 4 つのサーバーの位置は次の図のようになります。 明らかに、この状況は非常に不均一であり、データの偏りが発生します。上記の質問 2 の問題は、実際にはダウンタイムによって引き起こされるデータの偏りです。 リングの左上部分は非常に空いています。現在の 4 台のサーバーを使用して、他のルールに従って左上部分にいくつかのノードを生成することはできますか? この方法では、リクエストはより均等に分散されますか? これはいわゆる仮想ノードです。仮想ノードとは、同じサーバー IP であり、特定のルールに従って複数のハッシュ コードを生成するため、リング上に複数のノードが存在することになります。 次の図に示すように: ここでは、サーバーごとに 2 つの仮想ノードをシミュレートしていますが、開発中はさらに多くのノードがシミュレートされる予定です。この方法では、IP4 マシンがクラッシュしても、すべてのリクエストが 1 つのサーバーにプッシュされることはありません。 ここまで述べてきましたが、実装は難しくありません。次はコードを配置します (サーバー構成と要求されたクライアント IP はソース アドレス ハッシュ アルゴリズムと一致しているため、対応するコードをここに貼り付けず、アルゴリズム ロジックを直接配置します)。
この時点で、一般的に使用される負荷分散アルゴリズムとコード実装がいくつか紹介されました。まだ不明な点がある場合は、ゲイの出会い系サイトにアクセスしてサンプル コードをダウンロードし、自分でデバッグすることができます。
著者: 蘇静 紹介: 彼は、大規模なインターネット プロジェクトの開発において長年の経験があり、高同時実行性、分散性、マイクロサービス テクノロジーに関する詳細な研究と関連する実践経験を持っています。私は独学で、テクノロジーの研究と共有に熱心に取り組んでいます。私のモットーは、常に学ぶ心を持つことです。 [51CTO オリジナル記事、パートナーサイトに転載する場合は、元の著者とソースを 51CTO.com として明記してください] |
<<: 人工知能の次の転換点: グラフニューラルネットワークが急速な爆発の時代を先導する
1950 年代後半から 1960 年代前半にかけて、一群の芸術家と作家がパリの荒廃したホテルに移り住...
チャットボットは非常に一般的になったため、消費者はそれを当然のこととして受け止め、オンライン世界のあ...
私はアークティック・モンキーズが大好きですが、彼らはもう何年も新しいシングルをリリースしていません。...
年末から年始にかけて、ビッグモデルの過去を振り返り、ビッグモデルの未来に期待してみましょう。 28日...
一夜にして何千ものスタートアップが OpenAI に敗北しました。そうです、GPT-4 は昨夜再びひ...
クイックソートはバブルソートの改良版です。その基本的な考え方は、ソート パスを通じて、ソートするデー...
この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...
胸部X線(CXR)検査は、さまざまな病気のスクリーニングや診断に広く使用されている臨床画像診断法です...
機械学習の話題は誰もが話題にするほど普及していますが、それを完全に理解している人はほとんどいません。...
この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...
[[412540]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...
ロボティック・プロセス・オートメーション (RPA) は、今日最も急速に成長しているテクノロジーの ...
製造企業は、ビジネスのやり方を合理化し、効率を高めるために人工知能に注目しています。一般的な使用例を...