Java 上級: 5 つの負荷分散アルゴリズムの実装原理を深く理解する

Java 上級: 5 つの負荷分散アルゴリズムの実装原理を深く理解する

序文

負荷分散とは何ですか?

複数のサーバーを対称的に構成したサーバーセットを指します。各サーバーは同等の地位を持ち、他のサーバーの支援なしに独立して外部にサービスを提供できます。何らかの負荷分散技術により、外部から送信されたリクエストは対称構造のサーバーに均等に分散され、リクエストを受信したサーバーはクライアントのリクエストに独立して応答します。負荷分散により、クライアント要求をサーバー アレイに均等に分散できるため、重要なデータへの高速アクセスが可能になり、多数の同時アクセス サービスの問題が解決されます。このクラスター テクノロジにより、最小限の投資で大規模なメインフレームに近いパフォーマンスを実現できます。

今日は以下のことについてお話します。

1. 負荷分散アルゴリズムの概要

1. 投票方法

実際の接続数やサーバーの現在のシステム負荷に関係なく、各バックエンド サーバーを平等に扱い、リクエストをバックエンド サーバーに順番に分散します。

2. ランダム法

システムのランダム アルゴリズムにより、バックエンド サーバーのリスト サイズ値に基づいて、アクセスするサーバーの 1 つがランダムに選択されます。確率統計理論によれば、クライアントがサーバーを呼び出す回数が増えるにつれて、実際の効果は、各バックエンドサーバーへの呼び出し量を均等に分散すること、つまりポーリングの結果にどんどん近づいていきます。

3. 送信元アドレスのハッシュ

ソース アドレス ハッシュの考え方は、クライアントの IP アドレスを取得し、ハッシュ関数を通じて値を計算することです。この値は、サーバー リストのサイズに対してモジュロ演算を実行するために使用されます。結果は、クライアントがアクセスするサーバーのシリアル番号です。負荷分散には送信元アドレス ハッシュを使用します。同じ IP アドレスを持つクライアントの場合、バックエンド サーバー リストが変更されなければ、アクセスするたびに同じバックエンド サーバーにマップされます。

4. 加重ラウンドロビン

バックエンド サーバーによってマシン構成や現在のシステム負荷が異なる場合があり、そのためストレス耐性も異なります。構成が高く負荷が低いマシンに高い重みを割り当てて、より多くのリクエストを処理できるようにします。構成が低く負荷が高いマシンに低い重みを割り当てて、システム負荷を軽減します。重み付けポーリングはこの問題を適切に処理し、重みに従って順番にバックエンドにリクエストを分散します。

5. 加重ランダム法

加重ラウンドロビン方式と同様に、加重ランダム方式でも、バックエンド マシンの構成とシステムの負荷に基づいて異なる重みが割り当てられます。違いは、順番にではなく、重みに応じてバックエンド サーバーをランダムに要求することです。

2. 5つの負荷分散アルゴリズムを実装するコード

1. 投票方法

  1. java.util.*をインポートします
  2. java.util.concurrent.ConcurrentHashMapをインポートします
  3. パブリッククラスTestRoundRobin{
  4. // 1. マップ、キー IP、値の重みを定義する
  5. 静的Map<String,Integer> ipMap = new HashMap<>();
  6. 静的{
  7. ipMap.put( "192.168.13.1" , 1 );
  8. ipMap.put( "192.168.13.2" , 1 );
  9. ipMap.put( "192.168.13.3" , 1 );
  10. }
  11. // 整数合計=0;
  12. 整数 pos = 0 ;
  13. パブリック文字列ラウンドロビン(){
  14. Map<String,Integer> ipServerMap =新しいConcurrentHashMap<>();
  15. ipServerMap.putAll(ipMap);
  16. // 2. キーを取り出してセットに入れる
  17. Set<String> ipset=ipServerMap.keySet();
  18. // 3.set をリストに入れ、リストをループして取り出します
  19. ArrayList<String> iplist =新しいArrayList<String>();
  20. iplist.addAll(ipset);
  21. 文字列 serverName = null ;
  22. // 4. ループ値を定義し、設定より大きい場合は 0 から開始します
  23. 同期(正){
  24. (pos>=ipset.size())の場合{
  25. 位置 = 0 ;
  26. }
  27. serverName=iplist.get(pos);
  28. // 投票 +1
  29. 位置++;
  30. }
  31. serverNameを返します
  32. }
  33. パブリック静的voidメイン(String[] args) {
  34. テストラウンドロビン testRoundRobin =新しいTestRoundRobin();
  35. ( int i = 0 ; i < 10 ; i++) {
  36. 文字列 serverIp=testRoundRobin.RoundRobin();
  37. System.out.println(サーバーIP);
  38. }
  39. }
  40. }

2. 加重ラウンドロビン

  1. java.util.*をインポートします
  2. java.util.concurrent.ConcurrentHashMapをインポートします
  3. パブリッククラスTestWeightRobin {
  4. // 1.map、キー-IP、値の重み
  5. 静的Map<String,Integer> ipMap = new HashMap<>();
  6. 静的{
  7. ipMap.put( "192.168.13.1" , 1 );
  8. ipMap.put( "192.168.13.2" , 2 );
  9. ipMap.put( "192.168.13.3" , 4 );
  10. }
  11. 整数 pos = 0 ;
  12. パブリック文字列WeightRobin(){
  13. Map<String,Integer> ipServerMap =新しいConcurrentHashMap<>();
  14. ipServerMap.putAll(ipMap);
  15. Set<String> ipSet=ipServerMap.keySet();
  16. イテレータ<文字列> ipIterator=ipSet.iterator();
  17. //すべてのサーバーを配置するリストを定義する
  18. ArrayList<String> ipArrayList =新しいArrayList<String>();
  19. // セットをループし、セット内の値を使用してマップ内の値を取得し、対応する数のサーバーをリストに追加します。
  20. (ipIterator.hasNext())の間{
  21. 文字列 serverName=ipIterator.next();
  22. 整数の重み=ipServerMap.get(serverName);
  23. ( int i = 0 ; i < 重み ; i++){
  24. ipArrayList.add(サーバー名);
  25. }
  26. }
  27. 文字列 serverName = null ;
  28. if (pos>=ipArrayList.size()){
  29. 位置 = 0 ;
  30. }
  31. serverName=ipArrayList.get(pos);
  32. // 投票 +1
  33. 位置++;
  34. serverNameを返します
  35. }
  36. パブリック静的voidメイン(String[] args) {
  37. テストウェイトロビン testWeightRobin =新しいTestWeightRobin();
  38. ( int i = 0 ; i< 10 ; i++){
  39. 文字列 server=testWeightRobin.WeightRobin();
  40. System.out.println(サーバー);
  41. }
  42. }
  43. }

3. ランダム法

  1. java.util.*をインポートします
  2. java.util.concurrent.ConcurrentHashMapをインポートします
  3. パブリッククラスTestRandom{
  4. // 1. マップ、キー IP、値の重みを定義する
  5. 静的Map<String,Integer> ipMap = new HashMap<>();
  6. 静的{
  7. ipMap.put( "192.168.13.1" , 1 );
  8. ipMap.put( "192.168.13.2" , 2 );
  9. ipMap.put( "192.168.13.3" , 4 );
  10. }
  11. パブリック文字列ランダム() {
  12. Map<String,Integer> ipServerMap =新しいConcurrentHashMap<>();
  13. ipServerMap.putAll(ipMap);
  14. Set<String> ipSet=ipServerMap.keySet();
  15. //すべてのサーバーを配置するリストを定義する
  16. ArrayList<String> ipArrayList =新しいArrayList<String>();
  17. ipArrayList.addAll(ipSet);
  18. // 乱数をループする
  19. ランダム random = new Random();
  20. // リストの数量(1-list.size)から乱数が取得されます
  21. int pos=random.nextInt(ipArrayList.size());
  22. 文字列 serverNameReturn = ipArrayList.get(pos);
  23. serverNameReturnを返します
  24. }
  25. パブリック静的voidメイン(String[] args) {
  26. テストランダム testRandom =新しいテストランダム();
  27. ( int i = 0 ; i< 10 ; i++){
  28. 文字列 server=testRandom.Random();
  29. System.out.println(サーバー);
  30. }
  31. }
  32. }

4. 加重ランダム

  1. java.util.*をインポートします
  2. java.util.concurrent.ConcurrentHashMapをインポートします
  3. パブリッククラスTestRobinRandom{
  4. // 1. マップ、キー IP、値の重みを定義する
  5. 静的Map<String,Integer> ipMap = new HashMap<>();
  6. 静的{
  7. ipMap.put( "192.168.13.1" , 1 );
  8. ipMap.put( "192.168.13.2" , 2 );
  9. ipMap.put( "192.168.13.3" , 4 );
  10. }
  11. パブリック文字列RobinRandom(){
  12. Map<String,Integer> ipServerMap =新しいConcurrentHashMap<>();
  13. ipServerMap.putAll(ipMap);
  14. Set<String> ipSet=ipServerMap.keySet();
  15. イテレータ<文字列> ipIterator=ipSet.iterator();
  16. //すべてのサーバーを配置するリストを定義する
  17. ArrayList<String> ipArrayList =新しいArrayList<String>();
  18. // セットをループし、セット内の値を使用してマップ内の値を取得し、対応する数のサーバーをリストに追加します。
  19. (ipIterator.hasNext())の間{
  20. 文字列 serverName=ipIterator.next();
  21. 整数の重み=ipServerMap.get(serverName);
  22. ( int i = 0 ;i<weight;i ++ ){
  23. ipArrayList.add(サーバー名);
  24. }
  25. }
  26. // 乱数をループする
  27. ランダム random = new Random();
  28. // リストの数量(1-list.size)から乱数が取得されます
  29. int pos=random.nextInt(ipArrayList.size());
  30. 文字列 serverNameReturn = ipArrayList.get(pos);
  31. serverNameReturnを返します
  32. }
  33. パブリック静的voidメイン(String[] args) {
  34. TestRobinRandom testRobinRandom =新しいTestRobinRandom();
  35. ( int i = 0 ; i< 10 ; i++){
  36. 文字列 server=testRobinRandom.RobinRandom();
  37. System.out.println(サーバー);
  38. }
  39. }
  40. }

5. 送信元アドレスのハッシュ

  1. java.util.ArrayListをインポートします
  2. java.util.HashMapをインポートします
  3. java.util.Mapをインポートします
  4. java.util.Setをインポートします
  5. java.util.concurrent.ConcurrentHashMapをインポートします
  6. パブリッククラスipHash{
  7. // 1. マップ、キー IP、値の重みを定義する
  8. 静的Map<String,Integer> ipMap = new HashMap<>();
  9. 静的{
  10. ipMap.put( "192.168.13.1" , 1 );
  11. ipMap.put( "192.168.13.2" , 2 );
  12. ipMap.put( "192.168.13.3" , 4 );
  13. }
  14. パブリック文字列ipHash(文字列クライアントIP){
  15. Map<String,Integer> ipServerMap =新しいConcurrentHashMap<>();
  16. ipServerMap.putAll(ipMap);
  17. // 2. キーを取り出してセットに入れる
  18. Set<String> ipset=ipServerMap.keySet();
  19. // 3.set をリストに入れ、リストをループして取り出します
  20. ArrayList<String> iplist =新しいArrayList<String>();
  21. iplist.addAll(ipset);
  22. // IPのハッシュコード値の残りを取得します。これは毎回同じです
  23. intハッシュコード = クライアントIP.ハッシュコード();
  24. int serverListsize=iplist.size();
  25. int pos=ハッシュコード%サーバーリストサイズ;
  26. iplist.get(pos);を返します
  27. }
  28. パブリック静的voidメイン(String[] args) {
  29. ipHash iphash =新しいipHash();
  30. 文字列サーバー名 = iphash.ipHash( "192.168.21.2" );
  31. System.out.println(サーバー名);
  32. }
  33. }

要約する

前進しなければ、遅れを取ってしまいます。一緒に頑張りましょう。

<<:  2021 年の人工知能と自動化のトレンド

>>:  AI は金融業界がランサムウェアに効果的に対抗するのに役立つでしょうか?

ブログ    
ブログ    
ブログ    

推薦する

ロボットが密かに子供を産んだ?科学者たちも私も衝撃を受けました。

[[438325]]最近このニュースを見たことがあるだろうか。 「ロボットが赤ちゃんを産みました。...

アップルが従業員を解雇し調整、好景気の時代とは真逆! Apple AI の堀とは何でしょうか?

ウォール・ストリート・ジャーナルによると、アップルは最近、経営陣の再編と人事異動を行う措置を講じたと...

Google 研究者: AI が優秀すぎて「ラインを落とした」

数日前、人工知能の分野でほとんどブラックユーモアとも言えるニュースが発表された。Google のエン...

「ハードコア」AIが私たちの家庭に導入されるまでにはどれくらいの時間がかかるのでしょうか? 最先端技術には依然としてブレークスルーが必要

お腹が空いたら、キッチンロボットがミシュランレストランの基準に匹敵するステーキを調理します。運転した...

世界ロボット会議は、未来がここにあることを伝えます。

「リラックスして、直立不動で、右を向いてください!」司会者の指示に従い、一列に並んだロボットが一斉...

DeepMindは、あらゆる武器を持つロボットを簡単に倒すことができる視覚ベースの強化学習モデルを提案している。

人間は模倣が得意です。私たちや他の動物は、行動を観察し、それが環境の状態に与える影響を理解し、同じよ...

未来を待つ必要はありません。分析と AI の災害はすでに起こっています。

データと機械学習アルゴリズムから得られる洞察は非常に貴重ですが、ミスは評判、収益、さらには命を奪う可...

不妊治療の新たな夜明け:AI

世界初の試験管ベビーは1978年に英国で誕生した。それ以来、人工生殖技術は継続的に改良されてきました...

生成 AI が流行する中、コンプライアンス計画にはどのような変化が見られるのでしょうか?

消費者のショッピング嗜好を予測したり、軍事上の意思決定を導いたり、金融犯罪に関する独自の洞察を提供し...

...

AIがコンピューティングをエッジに押し上げる

[[408175]]ここ数年の流行語といえば、エッジ コンピューティングは 5G や AI と密接に...

新しいソートアルゴリズムの発明から始まる

このような単純なアルゴリズムは、先代のエンジニアが考え出したものであるに違いありません。初心者であっ...

AIとビッグデータに焦点を当て、インテルとToutiaoが技術革新研究所を設立

[原文は51CTO.comより] 8月22日、インテルとToutiaoの共同戦略協力記者会見と「デー...

職場は「理想の街」になり得るか?企業と従業員の両方にAIを活用した自動化が必要

従業員が複雑なタスクに圧倒され、毎日同じ作業を繰り返すうちに徐々に疲れ果てていく一方で、企業も業務プ...