4

クライアントの TCP (または UDP) リクエストにサービスを提供するサーバー アプリケーションを実装する際に人々が使用する戦略 (設計パターン、実装手法、ベスト プラクティスなど) を探しています。

この質問の目的のために、リクエストが比較的長期間 (数分) 存続し、トラフィックが時間に敏感であるため、メッセージへの応答に遅延が許容されないと仮定しましょう。また、クライアントからのリクエストを処理し、他のサーバーへの独自の接続を確立しています。

私のプラットフォームは .NET ですが、基盤となるテクノロジはプラットフォームに関係なく同じであるため、どの言語でも回答が得られることに興味があります。

4

4 に答える 4

6

最新のアプローチは、オペレーティング システムを利用して多くのネットワーク ソケットを多重化し、アプリケーションを解放してトラフィックのあるアクティブな接続のみを処理することです。

ソケットを開くたびに、セレクターに関連付けられます。単一のスレッドを使用して、そのセレクターをポーリングします。データが到着するたびに、セレクターはアクティブなソケットを示し、その操作を子スレッドに渡し、ポーリングを続行します。

この方法では、同時操作ごとにスレッドのみが必要です。開いているがアイドル状態のソケットは、スレッドを拘束しません。

于 2008-08-28T13:23:31.200 に答える
4

より洗練されたアプローチは、IO Completion ポートを使用することです。(Windows) IO Completion ポートを使用すると、オペレーティング システムにポーリングの管理を委ねることができます。これにより、NIC ドライバー サポートによる非常に高度な最適化を使用できる可能性があります。基本的に、OS が管理するネットワーク操作のキューがあり、操作が完了したときに呼び出されるコールバック関数を提供します。(ハードドライブ) DMA に少し似ていますが、ネットワーク用です。

Len Holgate は、数年前に Codeproject で IO 完了ポートに関する素晴らしいシリーズを書いています: http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

そして、.net の IO 完了ポートに関する記事を見つけました (まだ読んでいません) http://www.codeproject.com/KB/cs/managediocp.aspx

また、スケーラブルな代替案を試して書くよりも、補完ポートを使用する方が簡単だと思います。問題は、NT (2000、XP、Vista) でしか利用できないことです。

于 2008-08-28T14:26:26.557 に答える
2

C++ と Win32 を直接使用していた場合は、重複する I/O と I/O Completion ポートについて読むことをお勧めします。完全なソース コードを備えた無料の C++、IOCP、クライアント/サーバー フレームワークがあります。詳細については、こちらを参照してください。

.Net を使用しているので、すべての接続にスレッドを用意する必要がないように、非同期ソケット メソッドの使用を検討する必要があります。私のこのブログ投稿から、出発点として役立つリンクがいくつかあります 。 .html (最高のリンクのいくつかは、元の投稿へのコメントにあります!)

于 2008-09-17T08:18:34.167 に答える
0

こんばんは

まず、スレッド フレームワークに使用するメタファを調べます。

おそらく、スレッドが着信リクエストをリッスンし、新しいリクエストが来ると、それが作業を行い、プール内の次のスレッドが着信リクエストのリッスンを開始する「リーダーフォロワー」です。

または、同じスレッドが常に着信要求をリッスンし、スレッド プールで次に使用可能なスレッドに要求を渡すスレッド プール。

Ace コンポーネントのReactorセクションにアクセスして、アイデアを得ることができます。

HTH。

乾杯、ロブ

于 2008-08-28T13:26:41.723 に答える