Webサーバーは、単一のポート(80)で複数の着信要求を同時に処理する方法を教えてください。
例:30万人のユーザーが同時に、IP 10.10.100.100とポート80が割り当てられたwww.abcdef.comからの画像を見たいと思っています。
1台のサーバー(IP 10.10.100.100が割り当てられている)は、この膨大な量の着信ユーザーを処理できますか?そうでない場合、この負荷を処理するために、1つのIPアドレスを複数のサーバーにどのように割り当てることができますか?
tcpipguide から
このようにクライアントソケットとサーバーソケットの両方を使用して接続を識別することにより、インターネット上で当たり前と考えられているデバイス間の複数の接続を柔軟に行うことができます。たとえば、ビジーなアプリケーションサーバープロセス(Webサーバーなど)は、複数のクライアントからの接続を処理できる必要があります。そうしないと、World Wide Webはほとんど使用できなくなります。接続はクライアントのソケットとサーバーのソケットを使用して識別されるため、これは問題ありません。 Webサーバーが上記の接続を維持すると同時に、別の接続、たとえばIPアドレス219.31.0.44のポート2,199を簡単に確立できます。これは接続識別子で表されます:
(41.199.222.3:80, 219.31.0.44:2199).
実際、同じクライアントから同じサーバーへの複数の接続を確立できます。各クライアントプロセスには異なるエフェメラルポート番号が割り当てられるため、すべてが同じサーバープロセス(41.199.222.3:80のWebサーバープロセスなど)にアクセスしようとしても、すべて異なるクライアントソケットを持ち、一意を表します。接続。これにより、コンピューターから同じWebサイトに対して複数の同時要求を行うことができます。
繰り返しますが、TCPはこれらの各接続を個別に追跡するため、各接続は他の接続を認識しません。 TCPは、数百または数千の同時接続を処理できます。唯一の制限は、TCPを実行しているコンピューターの容量と、そのコンピューターへの物理接続の帯域幅です。一度に実行する接続が多いほど、それぞれが限られたリソースを共有する必要があります。
ポートは単なるマジックナンバーです。ハードウェアには対応していません。サーバーは、ポート80で「リッスン」するソケットを開き、そのソケットからの新しい接続を「受け入れ」ます。新しい接続はそれぞれ、ローカルポートもポート80であるが、リモートip:portが接続したクライアントごとにある新しいソケットによって表されます。したがって、それらは混同されません。したがって、サーバー側に複数のIPアドレスや複数のポートは必要ありません。
TCPはクライアントの識別を処理します
午前中に述べたように、TCPはクライアント識別を処理し、サーバーはクライアントごとに「ソケット」のみを認識します。
10.10.100.100のサーバーがポート80で着信TCP接続(HTTPはTCPを介して構築されます)。クライアントのブラウザー(10.9.8.7))がサーバーに接続することを待ちます。サーバーは、「クライアント10.9.8.7:27143が接続を望んでいますか、受け入れますか?」と認識します。サーバーアプリは受け入れ、これとのすべての通信を管理するための「ハンドル」(ソケット)を与えられます。クライアント、およびハンドルは常に適切なTCPヘッダーを持つ10.9.8.7:27143にパケットを送信します。
パケットは同時ではない
現在、物理的には、通常、サーバーをインターネットにリンクする接続は1つ(または2つ)しかないため、パケットは順番どおりにしか到着できません。問題は、ファイバを介した最大スループットと、サーバーが計算して返送できる応答の数です。 CPUは、要求への応答中に費やすCPU時間やメモリのボトルネック以外に、通信が終了するまで一部のリソース(クライアントごとに少なくとも1つのアクティブソケット)を維持する必要があるため、RAMを消費します。スループットは、いくつかの最適化(相互排他的ではない)によって実現されます:ノンブロッキングソケット(パイプライン化/ソケットレイテンシを回避するため)、マルチスレッド(より多くのCPUコア/スレッドを使用するため)。
リクエストのスループットをさらに向上させる:負荷分散
そして最後に、ウェブサイトの「フロントサイド」にあるサーバーは通常、すべての作業(特にデータベースクエリや計算などのより複雑なもの)を単独で実行せず、タスクを延期したり、さらには転送したりします。分散サーバーへのHTTP要求。1秒あたりできる限り多くの要求を簡単に処理(転送など)し続けます。複数のサーバーにわたる作業の分散は、負荷分散と呼ばれます。
1)Webサーバーは、単一のポートで複数の着信要求を同時に処理する方法(80)
==> a)Webサービスの1つのインスタンス(例:スプリングブートマイクロサービス)は、ポート80のサーバーマシンで実行/リッスンします。
b)このWebサービス(Springブートアプリ)には、ほとんどTomcatのようなサーブレットコンテナが必要です。
このコンテナにはthread poolが設定されます。
c)異なるユーザーから同時にリクエストが来た場合、このコンテナは
着信リクエストごとにプールから各スレッドを割り当てます。
d)サーバー側のWebサービスコードにはBean(Javaの場合)がほとんど含まれるため
シングル、各リクエストに対応する各スレッドはシングルトンAPIを呼び出します
そしてデータベースへのアクセスが必要な場合、これらの同期
スレッドが必要です。これは、@ transactionalアノテーションを介して行われます。この
注釈はデータベース操作を同期します。
2)1台のサーバー(IP 10.10.100.100が割り当てられている)は、この膨大な量の着信ユーザーを処理できますか?
そうでない場合、この負荷を処理するために、1つのIPアドレスを複数のサーバーに割り当てる方法を教えてください。
==>これは、ルートテーブルとともにロードバランサーによって処理されます
答えは次のとおりです。HTTPホストの仮想ホストはドメインの名前であるため、Webサーバーはどのファイルが実行またはクライアントに送信されるかを認識します。