2016-12-21 11 views
0

要件: WindowsサービスベースのC#.NET 4.5は常に縦(または少なくとも長)接続されたTCPサーバーアーキテクチャで、可能な最大接続数。クライアントはどんなIoT(事のインターネット)でもかまいません。C#.Net 4.5を使用して効率的かつスケーラブルに接続されたTCP Windowsサービス4.5

私はポートの制限を認識していますが、なぜこのテクノロジーの時代のこれらの制限(私たちは常に限界がありますが、なぜ古いものなのでしょうか?また、一時的なtcp/http接続はうまくスケーリングされますが、ここでは必須ではありません。

デザイン:非同期受け入れる新しい接続(サーバーの存続期間)のためのサーバーごと

  • シングルスレッド。 コード:rawTcpClient = await tcpListener.AcceptTcpClientAsync();

  • クライアント接続ごとに1つのスレッド(ループ)がクライアント接続を保持しますか?

クライアント操作(短期、断続
操作)を実行するためのタスクの最適化に関する私の質問(?可能な場合)

  • を(下の私のQを参照してください): をどのようにして最適化することができます/これはクライアントの存続期間であるため、接続ごとに1つのスレッドではなく、一連のスレッド/スレッドプールにすべてのクライアント接続を保持するように管理します。
    例:接続されたクライアントを保持するために割り当てられたタスクは、サーバーごとに50個しか割り当てられていないため、切断されず、クライアントデータを待機しています。

  • +3

    これはまだWCFのユースケースです。 –

    +0

    WCFはこれを正確に行います。 – Ben

    +0

    そして、おそらくその多くのスレッドを使用しないでください。 – VMAtm

    答えて

    0

    効率的な&スケーラブル

    あなたが決定する必要があり、非常に最初の事はあなたがなりたい方法を効率的です。効率が最優先であれば、ソケットAPIはを極端ににすることができます。しかし、効率はほとんどありません多くの人にもかかわらず、だと思います。問題は、効率性/スケーラビリティで複雑さが指数関数的に増加する可能性があることです。効率/スケーラビリティを単純に最大化すれば、ほとんど維持できないシステムになります。だから、あなたはその規模で線を描く場所を決めなければならないでしょう。

    特に水平スケーリングを使用している場合は、極端な効率のソケットAPIを使用する必要はないでしょう。

    私はポートの制限について認識していますが、この技術的な時代のこれらの制限(私たちは常に限界がありますが、なぜ古いものなのでしょうか?

    互換性。特にポートは16ビットの値で表されます。これが変わる唯一の方法は、新しい標準が出てすべてがアップグレードされたかどうかです。 NIC、ゲートウェイ、ISP、およびIoTデバイスが含まれます。それは高次であり、おそらく決して起こらないでしょう。

    async-accept新しい接続(サーバーの有効期間)用のサーバーごとに1つのスレッド。

    これは問題ありません。接続回転率が高い場合は、複数の受け入れスレッドを持つこともできます。バックログを高く保つだけです(Windows Server OSではデフォルトで高くなるはずです)。

    クライアント接続(ループ)ごとに1つのスレッドがクライアント接続を保持しますか?

    Er、no。

    あなたは確実に非同期I/Oを使いたいでしょう。

    接続されたすべてのクライアントで連続した(非同期の)読み取りを行い、必要に応じて書き込みを実行する必要があります。また、プロトコルで許可されている場合は、接続されている各クライアントにハートビートメッセージを定期的に書き込む必要があります。それ以外の場合は、各クライアントが接続を切断するためのタイマーが必要です。書き込みの性質によっては、クライアントごとに保留中の書き込みのキューが必要な場合があります。あなたは非同期タスクを使用している場合

    クライアント操作(短期、断続的 操作)を行うためのタスクが

    、その後、すべてのあなたの実際のコードは、単に利用可能であるものは何でも、スレッドプールのスレッド上で実行されます。専用のタスクはまったく必要ありません。

    私のTCP/IP .NET Sockets FAQが役に立ちました。

    +0

    私は非同期読み取り(非同期I/O)を試みましたが、クライアントごとに常に1つのスレッドが必要であることに気づき、その結果、同じスレッド(ID)が続き、解放されませんでした。私はあなたの優れたブログを見に行きましたが、単一のスレッドまたは限られたプールで複数のクライアント接続を管理する上でサンプルや詳細を見つけることができませんでした。 –

    +0

    @ Guru_07:非同期I/Oは* awaitの間にスレッド*のみを使用します。 'SynchronizationContext'や' TaskScheduler'を使用していない場合は、スレッドプールスレッドを使用します。特に、低ストレステストでは、同じスレッドプールスレッドを使用してメソッドを再開することが可能です。それには何も問題ありません。実際には最適化されています(スレッドプールは[プロセッサごとのキャッシュを最大化するためにスレッドごとのキューを使用します](https://blogs.msdn.microsoft.com/jennifer/2009/06/26/work-stealing-in -net-4-0 /))。 –

    関連する問題