web-dev-qa-db-ja.com

100万の同時接続を維持する方法TCP接続?

私は同時に TCPを介してサーバーに接続されている何百万ものクライアントにサービスを提供する必要があるサーバーを設計します。

サーバーとクライアント間のデータトラフィックはまばらなので、帯域幅の問題は無視できます。

重要な要件の1つは、サーバーがクライアントにデータを送信する必要がある場合は常に、クライアントへの新しい接続を開くのではなく、既存のTCP接続を使用する必要があることです(クライアントがファイアウォールの背後にある可能性があるため)。 。

これを行う方法、および必要なハードウェア/ソフトウェア(最低限のコスト)を誰かが知っていますか?

41
cow

このためにどのオペレーティングシステムを検討していますか?

Windows OSを使用していて、Vista以降のものを使用している場合は、1台のマシンで何千もの接続が発生しても問題はありません。低スペックのWindows Server 2003マシンでテスト(ここでは http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html )を実行し、 70,000以上のアクティブな接続を簡単に達成TCP接続。可能な接続数に影響するリソース制限の一部は、Vistaで大幅に解除されました(ここを参照してください: http:// www。 lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html )そして、あなたはおそらくマシンの小さなクラスターであなたの目標を達成することができたでしょう。それらの接続をルーティングします。

Windowsは、I/O完了ポートと呼ばれる機能を提供しています(以下を参照してください http://msdn.Microsoft.com/en-us/magazine/cc302334.aspx )。これにより、数千の同時接続を処理できます。非常に少ないスレッドで(I/Oを処理するために2つのスレッドでサーバーへのリンクを飽和させる5000接続で昨日テストを実行していた...)したがって、基本的なアーキテクチャは非常にスケーラブルです。

いくつかのテストを実行したい場合は、何千もの接続( 1 )と( 2 =)とあなたが始めるのに使用できるいくつかの無料のコード()

コメントからの質問の2番目の部分はよりトリッキーです。クライアントのIPアドレスが変化し続け、あなたとクライアントの間にNATを提供して一貫したIPアドレスを提供するものが何もない場合、それらの接続は間違いなく終了し、再接続する必要があります。確立されました。クライアントがIPアドレスの変更時にこの接続の切断を検出した場合、クライアントはサーバーに再接続できます。接続できない場合は、クライアントが接続を検出できるように、サーバーを頻繁にポーリングする必要があることをお勧めしますサーバーは新しいIPアドレスを予測できず、データを送信しようとしたときに古い接続が失敗したことを検出するため、ここでサーバーが実行できることは何もありません。

そして、あなたの問題は、あなたのシステムがこのレベルにスケールするようになって初めて始まります...

20
Len Holgate

この問題は、いわゆる C10K 問題に関連しています。 C10Kページには、何千ものクライアントが同じサーバーに接続できるようにするときに発生する問題に対処するための多数の優れたリソースがリストされています。

11
Greg Hewgill

私は APE Project に出くわしました。夢が叶ったようです。 1つのノードで最大10万の同時クライアントをサポートできます。それらを10または20のノードに分散すると、数百万のサービスを提供できます。 RESTfulアプリケーションに最適です。共有されている名前空間をもっと深く見たいかもしれません。 1つの欠点は、Webサーバーを補足する場合のように、これがスタンドアロンサーバーであることです。このサーバーはもちろんオープンソースなので、コストはハードウェア/ ISPに関係しています。

4
Vic

UDPは使用できません。クライアントがリクエストを送信し、すぐに応答しない場合、ルーターは30秒以内に逆ルートを忘れるので、サーバーはクライアントに応答できません。

TCPが唯一の選択肢であり、それもまた頭痛の種になるでしょう。ほとんどのルーターは、ルートを忘れたり、数分後に接続をドロップしたりするため、クライアント/サーバーコードは「キープアライブ」をかなり頻繁に送信する必要があります。

「スニッファ」をセットアップして、電話会社がどのようにして「プッシュ」テクノロジーのためにスマートフォンと連絡を取り続けているかを確認することをお勧めします。彼らがやっていることは何でもコピーしてください、それはworks

1
Chris

グレッグが述べたように、あなたが説明している問題はC10K(またはあなたのケースではむしろ「C1M」)です私は最近、単純なTCPエコーサーバーを作成しました。 epoll キューを使用して、最大200.000までしかテストされていません。BSDでは、kqueueと呼ばれる同様のものが使用されています。必要に応じて code を確認できます。これは助けになり、幸運です!

0
Arnout