Netty
を使用してUDP
ロードバランサを作成しています。Nettyを使用するUDPロードバランサ
ロードバランサは、ローカルトランスポートアドレスをリッスンします。 Netty
に関しては、このアドレスでリッスンするために1つだけChannel
が作成されます。次に、着信UDPパケットは、単一スレッドのイベントループグループの単一スレッドによって、処理のためにワーカースレッドのプールにディスパッチされます(ここでは、処理はロードバランシングを実行することを意味します)。
アウトバウンド側では、複数のサーバーを利用できます。受信したすべてのUDPパケットについて、関連するワーカースレッドはサーバーを選択し、このサーバーにUDPパケットを転送します。 UDPパケットを転送するには、Channel
が必要です。サーバーへのすべてのパケットを転送するために使用される単一のアウトバウンドChannel
を使用して
- :
私は4つのアプローチを見ることができます。この方法を使用すると、パケットは常に同じ転送アドレスから送信されます。
- 利用可能なサーバーごとに1つのアウトバウンド
Channel
を使用します。サーバーに転送されたすべてのパケットは、そのサーバーに関連付けられたChannel
を使用して転送されます。 - Nアウトバウンド
Channel
利用可能なサーバーごとに。サーバーに転送されたすべてのパケットは、そのサーバーに関連付けられたChannels
のグループのChannel
を使用して転送されます。 - 転送するパケットごとに新しい
Channel
を使用する。
私はアプローチ4を試みましたが、それは悪い性能をもたらすことがわかります。特に、大きすぎるソケットが作成されたため、オープンされているファイルの制限を超えてしまったという問題がありました。
Channels
は複数のパケットで共有されるため、1,2,3のアプローチではUDPパケット内にリクエストの送信者アドレスを追加する必要がありますが、実際にパケットを処理するサーバーにはこの情報が必要です。
1,2,3の推奨アプローチは何ですか?宛先サーバーごとに1つ以上のChannel
を使用することをお勧めしますか?
EDIT:私の心に来る
別のアプローチは、Channels
の共有プールを使用することです。 UDPパケットが受信されると、利用可能なサーバが選択され、プールからChannel
が選択され(例えばラウンドロビン選択アルゴリズムを使用して)、Channel
を使用してパケットが転送される。