web-dev-qa-db-ja.com

ロングポーリングをサポートするWebサーバーをスケールアップする方法

増加するクライアントをサポートするためにWebアプリケーションサーバーをさらに追加し、負荷分散と高可用性のためにHAproxyとKeepalivedを展開することを計画しています。

私のサーバーの使用法には次の特徴があります。

  1. ジョブはCPUを集中的に使用しません。メッセージは100文字未満のJSONテキストです。
  2. ユーザーはクライアントデバイスYを介してサーバーにメッセージを送信します。通常、1日あたり4〜5メッセージ
  3. クライアントデバイスXは、サーバーからのメッセージを待機し続けます。メッセージがサーバーで利用可能な場合、クライアントデバイスXは2秒以内にメッセージを取得できる必要があります。それ以外の場合、このメッセージは古くなっています。

このために、

  1. クライアントデバイスXは、応答性を高めるためにロングポーリングHTTP接続を使用しています。各接続は5秒間続き、再接続します。
  2. クライアントデバイスXとクライアントデバイスYは同じサーバーに接続されているため、XとYはメッセージを簡単に送信できます。

質問

サーバーに接続しているクライアントデバイスXが60,000を超える場合、ロードバランサーまたはルーターのTCPポートが不足します。たとえば、20,000ユーザーにスケールアップするための最良の方法は何ですか?

私のサーバーは、TomcatとJavaサーブレットを使用して、Ubuntuサーバーで実行されています。

6
Mickey

私はあなたの60kクライアントが実際の問題ではないと思います。ファイル記述子が不足しているという問題が発生する可能性が高くなりますが、OS構成の一部として簡単に修正できるはずです。

これが、接続が問題にならない理由です。各接続は、送信元IPアドレス、送信元ポート、宛先IPアドレス、および宛先ポートによって特徴付けられます。ネットワークスタック内では、この4つがパケットをファイル記述子に一致させるために使用されます(各ファイル記述子は接続を表します)。サーバーには固定の宛先IPアドレスと宛先ポートがあります(サーバーはクライアントの宛先です)が、送信元IPアドレスと送信元ポートは可変です。ポートは16ビットの数値であるため、1つのクライアントからの接続の最大数は64Kです。 IPv4アドレスは32ビットの数値であり、4,294,967,296の可能な送信元アドレスを提供します。いくつかの基本的な計算を行うと、サーバーは64K * 4,294,967,296の接続を単一のソースIPとポートにマップすることができます。

これが、クライアントの数よりも開いているファイル記述子の最大数に問題が発生する可能性が高い理由です。

5
markovuksanovic

最も簡単なアプローチは、DNSレベルで負荷分散を実装することです。

手段:2、3、またはそれ以上の物理ロードバランサーとバランスを取るラウンドロビンDNSエントリがあります。

1
Tom