2011-10-21 16 views
2

私は、1つの(そして1つの)クライアントからデータを取得するTCPサーバーを持っています。このクライアントがデータを送信すると、サーバーへの接続が確立され、1つの(論理的な)メッセージが送信され、その後、その接続ではそれ以上送信されません。TCP接続にリソースが集中していますか?

次に、次のメッセージを送信するために別の接続を行います。

私は、これはリソースの観点から非常に悪いと言っている同僚です。彼は接続を作ることは資源を大量に消費し、しばらく時間を要すると言います。彼は、私はこのクライアントに接続をさせ、それから私たちが通信する必要があるかぎり(またはエラーがあるまで)それを使い続ける必要があると言います。

別々の接続を使用するメリットの1つは、多分それらをマルチスレッドして、回線上でより多くのスループットを得ることができるということです。私はこれを私の同僚に言及し、彼は多くのソケットを開いているとサーバーを殺すと言いました。

これは本当ですか?または、送信する必要がある各論理メッセージに対して個別の接続を許可することもできます。 (論理メッセージでは、可変長のxmlファイルを意味することに注意してください。)

+0

問題が発生しましたか?あなたの現在の実装では?必要以上に難解なソリューションを作成しないでください。 – zerkms

答えて

1

オープンしようとしている接続の数と開く予定の速度によって異なります。

TIME_WAITの状態を回避するために、接続を正常に終了するのではなく、中断しない限り、クライアントまたはサーバーのいずれかにソケットTIME_WAITが蓄積されます。単一のクライアントでは、問題が同じになるため、これらの累積場所は実際には問題になりません。あなたの接続を使用する速度が、あなたのTIME_WAIT接続が閉じる速度よりも速い場合、すべての接続が使用されているため一時的なポートが残っていないため、新しい接続を開くことができなくなりますソケットはTIME_WAITにあります。

私はここにはるかに詳細に本について書く:一般的にhttp://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html

私はあなたが単一の接続を維持し、それがリセットされた場合は、単にそれを再度開くことを示唆しています。ロジックはもう少し複雑に見えるかもしれませんが、システムははるかに優れています。 1人のクライアントしかいない可能性があります。接続速度はTIME_WAITの問題を抱えているとは思えませんが、これらの事実はシステムの寿命の間は同じではないかもしれません...

1

TCP接続の開始シーケンスは非常に簡単な3ウェイハンドシェイクで、非常にオーバーヘッドが低くなります。一定の接続を維持する必要はありません。

また、多くのTCP接続を使用すると、サーバーが非常に高速に停止することはありません。現代のハードウェアとオペレーティングシステムは、何百ものTCPコネクションを処理できますが、明らかにこの問題の範囲外にあるDoS攻撃を恐れている場合は除きます。

+0

1分あたり500の論理メッセージがピークに達する可能性があることを知るために何か変わっていますか?それとも本当に問題ではないのですか? (私はそうでないと願っています) – Vaccano

+0

毎分500のmsgsがピークに過ぎず、平均値が20のようなものなら、最適化する必要は本当にありません。 500が安定していれば、オープンな接続を維持するのはおそらく論理的です。 – Variant

+0

実際には、すべてのメッセージが同じクライアントからのものであり、おそらく並行して送信されないため、100msという非常に高速な往復時間では、おそらく500ms /秒のスループットが許容されません。 – Variant

1

サーバーにクライアントが1つしかない場合、実際にはメッセージごとに新しいTCPソケットを開く際に問題があるとは思いません。あなたの同僚のように、早めに最適化するのが好きです。

ただし、サーバーにメッセージがあふれていると問題になることがあります。しかし、依然として、単一のクライアントでは、私はそれについて心配しません。

完了したらソケットを閉じるようにしてください。サーバーに無礼にする必要はありません:)

1

UDPには、誰もが言ったことに加えて、UDPを検討してください。これは、応答が期待されない小さなメッセージやローカルネットワーク(インターネットとは対照的に)では、実際的に信頼性があります。

+0

+1 UDPの場合。通知スタイルのメッセージには、はるかに意味があります。 – rossipedia

+0

チップをありがとうが、私はメッセージをACKする必要があります。 – Vaccano

1

サーバーの観点から見ると、非常に多数の接続を開いても問題はありません。クライアントの観点から

How many socket connections can a web server handle?

、測定はあなた 時間が接続を開始し、並列処理をしたい避ける必要を示している場合、あなたは接続プールを作成することができます。複数のスレッドがそれぞれの接続を再利用し、完了したらそれらをプールに戻すことができます。それは複雑さのレベルをもう一度高めるので、必要なことを確認してください。また、アクティビティに基づいてプールを縮小したり拡張したりするロジックを持つこともできます。アプリケーションがちょうどアイドルになっている間に、夜間にサーバーに接続を開いたままにしておくことができます。

関連する問題