2

特定の IP アドレスとポートの組み合わせをリッスンして受け入れることができるプロセスが 1 つだけの場合、何百万もの着信要求をリッスンするために、Web サーバーはどのようにスケーリングするのでしょうか? この質問は、スケーリングのためのソケット プログラミングの概要を見つけることに関連しているため、ハードウェア スケーリング ソリューションを使用した負荷分散や、Web ソケットの実装を探しているわけではなく、基本的な低レベルのソケット プログラミングを探しているわけではありません。

着信 HTTP 要求をリッスンする Web サーバーを作成する必要がある場合、着信要求を何百万もの着信要求にスケーリングするために、着信要求をリッスンするスレッドの設計概要はどうすればよいですか?

4

3 に答える 3

2

私は自分用に小さなチャット サーバーを作成しました (これは基本的に同じ種類のことを行います)。

私が目指した設計は、接続を受け入れる最初のスレッドでした (基本的には、オブジェクト インスタンスwhileを反復するループ)。そのスレッドは 接続です。accept()ServerSocketlistening to

そして、によって返されるすべての接続に対してaccept()、その接続を処理する別のスレッドを開始しましたreads from。これらのスレッド参照はすべて、List後で接続を閉じるなど、さらに処理するために同期に格納されていました。

于 2013-07-28T12:24:02.183 に答える
1

あなたは「聞く」と「読む」を混同しています。それらは同じものではありません。「リッスンする」とは、サーバーが接続を受け入れることができるリッスン ソケットを大量に作成することを意味します。これらの各接続は、読み取りおよび書き込みが可能です。

于 2013-07-28T12:16:32.900 に答える
1

何百万もの同時接続が必要な場合、それを達成することはできません。通常、制限は数千単位です。一方、1 秒あたり数百万のリクエストを処理したい場合は、それでうまくいくかもしれませんが、リクエスト処理が最も単純な種類のものであり、応答が非常に短い場合に限られます。

一般に、Java でこれを行う場合、標準のブロッキングjava.ioAPI を使用しないでください。これは、1 つの接続ごとに 2 つのスレッド (読み取り用と書き込み用) を使用するためです。代わりに、非同期 TCP 通信を可能にする Netty ライブラリを使用します。これは、適度なサイズのスレッド プールのみが非常に多数の要求を処理できることを意味します。スレッドは、入力の受信または出力の送信を待ってアイドル状態になることはありません。彼らはデータの処理だけで忙しくなります。

于 2013-07-28T12:35:55.713 に答える