0

私の erlang インスタンスに接続する c ノードのクラスターがあり、それらの間でメッセージを分散する必要があります。これを行う私の現在の方法は-define、cnode 名アトムのリストの を持ち、リストをgen_server回転させて現在先頭にあるものを送り返すことで名前の要求に応答するだけであり、要求プロセスはそれと対話しますノードが与えられました。残念ながら、これらの c ノードは非常に頻繁に使用されており、gen_server大幅にバックアップされています (キュー内のメッセージは約 2k ~ 6k にとどまっています)。

これらの c-node 間で「負荷分散」できる他の方法があるかどうか疑問に思っています。私の最初の考えは、プロセスが要素と対話する必要があるときはいつでもリストからランダムな要素を選択することでしたが、それは私には非常に非効率的です. 私が考えていない他の方法はありますか?

4

1 に答える 1

3

あなたが試すことができる他のいくつかの方法があります:

  1. ハッシュ- クライアント ID または一意のものを取得し、ダウンストリーム サーバーのリストをハッシュして選択します。
  2. ラウンド ロビン- すべてのダウン ストリーム サーバーを ets テーブルに格納し、最後にアクセスしたタプルを保持します。次に、ets テーブルからすべてのサーバーを取得し、最近使用されていないものを見つけて、同時にフィールドを更新します。
  3. ランダム- 1 つだけ選択してください。

しかし、私は Saurabh Barjatiya に同意する必要があります。

... ベンチマークを実行せずにランダム配布をあきらめないでください。

ランダムなパーティショニングは「非効率的」であり、必要なものに対して十分に「スムーズ」ではないだろうと考えたため、ラウンド ロビン ロード バランシングを実行しようとした運用システムがありました。

いくつかの異なるソリューション(etsテーブル、ハッシュ、gen_serverなど、ほとんどが上記の3つと、他のいくつかの本当に恥ずかしいソリューション)を試した後、十分に機能しないことを知って、次のことを試しました:

Count = length(Targets),
random:seed(now()),
Route = lists:nth(random:uniform(Count),Targets),

ローカルでテストした後、実稼働システムでテストしたところ、 (最速ではないにしても)十分に高速であり、すべてが必要な分だけスムーズに分散され、パフォーマンスの問題は発生していません。

一般的に、私と同じ過ちを犯したり、最適化する必要のない複雑なコードを最適化して時間を無駄にしたりしないでください。常にソリューションをベンチマークして、仮定が正しいかどうかを実際に確認してください。

于 2013-10-14T21:49:56.430 に答える