nodejs負荷バランス(二):RPC負荷バランス


概要
このページは確かに長引きました.前節はサービス負荷の均衡の実現について話しましたが、もし遠隔サービスを起動する必要があるなら、どのように保証しますか?これはConsumerを実現します. rpcを端呼出しする負荷の均衡.この文章では主にRPC負荷バランスアルゴリズムの実現について説明します. .
アルゴリズム
いくつかの主要な負荷均衡アルゴリズムがどのように実現されるかを紹介します.私が書いたNPMパケットload-balancer-algorithmを見てもいいです.
const LBA = require('load-balancer-algorithm');

const weightRandomPool = [
  { host: "127.0.0.2", weight: 2 },
  { host: "127.0.0.1", weight: 3 },
  { host: "127.0.0.3", weight: 5 },
];
const weightedList = []
const loadBalance = new LBA.WeightedRoundRobin(weightRandomPool);

for(let i = 0; i < 10; i++){
  const address = loadBalance.pick();
  weightedList.push(loadBalance.getWeight(address.host))
}
// [5, 5, 3, 5, 2, 3, 5, 2, 3, 5]
console.log(weightedList)
Round Robin
ポーリング(Round robin) アルゴリズムとは、サービス・キューを順次ポーリングするノードのことで、繰り返し実行するのが簡単です.
  • 消費側がバランスを取る
  • を呼び出します.
  • は、現在の下付き+1対のデータプール長の数取モードにより、次のノード下付き
  • を取得する.
    短所:
  • は、サービス提供ノードの性能が一致することを要求する.
    ウェightted Round Robin
    重み付きポーリング(Weightted round robin)アルゴリズムは、ポーリング添加重みに基づいて判断され、性能の低いサービスノードに対してトラフィックを低減することができる.
  • 重みのリアルタイム同期
  • を動的に調整する.
  • 比較均衡アルゴリズム
  • しかし、重大なサービスノードが突然負荷が上昇するため、 が発生する. (smboth Weightted Round Robin)は、平滑分布の取得ノード
  • である.
    [
      { host: "127.0.0.1", weight: 2 },
      { host: "127.0.0.2", weight: 3 },
      { host: "127.0.0.3", weight: 5 },
    ]
    // normal
    // [5, 5, 5, 5, 5, 3, 3, 3, 2, 2]
    // smooth
    // [5, 5, 3, 5, 2, 3, 5, 2, 3, 5]
    Source IP Hash
    Source IP hash (consistent hash)アルゴリズムは、クライアントIP要求をサーバに固定的に割り当てるために、同じsessionを取得することを実現する. ,仮想ノードの整合性hashの実現を見ても、現在主流で推奨されています.
  • は、ノードIPを介して N個のhashを生成する. ,その後、hashを通過する. N個の仮想ノードの値を取得し、要求データ(ipまたはパラメータ)と生成されたhash 最も近いノード
  • を比較する.
  • nodejsは主にsticky sessionsモードで使用されており、アクセスが同じサービス上のsession
  • であることを確認している.
    短所:
  • は他のアルゴリズムに対して負荷の等化性が低く、性能も比較的低い
  • である.
  • 固定のIPサービスが掛かっています.ユーザsession なくしますから、いい方法はやはりsessionです. 共有
  • 例えば、図の各ノードが2つの仮想ノードを生成し、要求データに基づいてsh値を生成し、どの値が最も近いかを比較し、どのノードにアクセスするかを決定する.
    Random
    ランダム(Random) アルゴリズムは、ランダムにpoolを生成する. 長さ数の範囲内の整数をランダムに取得するマシンです.
  • は衝突率が高いが、呼び出し量が大きいほど平均
  • ランダムに1つの0~pool.lengthの範囲内の値
  • Weightted Random
    重みランダムアルゴリズムは、マシンの性能が一致しない場合、ランダムベースで重みを加えて計算します.
  • ランダムに1つの0~total Weightted値を計算し、poolを順次減算する. のノード重み付けが0より小さい場合、ランダム値が現在の重み範囲内に落ちることを表す
  • let offset = randomInteger(totalWeight);
    for (let i = 0; i < len; i++) {
      //        ,         
      offset -= this.getWeight(pool[i]);
      if (offset < 0) {
        address = pool[i];
        break;
      }
    }
    Least Connection
    最小接続(Least connections)アルゴリズムは、接続数が少なくとも少なくてもサービスノードが優先的に起動する.
  • は、統計的接続または要求数
  • を必要とする.
  • サーバの性能が一致しています.
    Weightted Least Connection
    重みが少なくとも接続されたアルゴリズムは、少なくとも接続されたサービスノードに基づいて重みを増加させる判定である.
    この文章も長い間我慢していました.文章を書き終えたいです. ,しかし、多くのことを発見しました.考えてみますか?それとも別々に書いてください.後に「nodejs負荷バランス(三):RPC実現」を書きます.
    詳細はNPMパッケージload-balancer-algorithmを参照してください.