0

シナリオは次のとおりです。

サーバーに要求を送信するクライアントがあります (ソケットまたは wcf サーバーになりますが、これは重要ではありません)。

サーバーはオープンな二重チャネルを維持し、それを使用して応答 (シリアル化されたデータ) をクライアントに送信します。サーバーは要求を処理し、クエリの生成 (要求のパラメーターに基づく) と、さまざまな種類のデータ ソース (SQL サーバー、ファイル システム、分析サービス サーバー - olaps、オフライン キューブなど) に対する実行を行います。非常に重い IO バウンド タスク - 確かに長時間実行されることがよくあります。

パフォーマンスは重要です。同時に数百または数千のリクエストを検討してください。スケーラブルでなければなりません。

TPL を使用したことも、非同期サーバーを作成したこともありません。しかし、私は数日間たくさん読んだのですが... まだ頭を包むことができません.

  1. TPL (4.5 ではなく 4.0) はここで良い選択ですか?
  2. サーバーに送信されるすべてのリクエストに対して tpl タスクを作成する必要がありますか? (非同期処理用)
  3. これらのタスクを LongRunning オプションで作成する必要がありますか? (そのため、ThreadPool は関係ありません)
  4. リクエストのキューメカニズムを実装する必要がありますか? どのように?
  5. 要求処理のすべての部分 (a. クエリの生成 b. データ ソースに対するクエリの実行) を別々のタスク (継続) でチェーン化する必要がありますか、それとも両方に単一のタスクを使用しても問題ありませんか? とb。
  6. クエリの実行に .FromAsync タスク生成を使用する必要がありますか? または、標準の .StartNew で十分ですか?
  7. 上記の要件を考慮して、他に注意すべき重要な領域は何ですか?
4

1 に答える 1

2

このトピックについては多くの議論がありました...たとえば、https://stackoverflow.com/a/908766/1876226を参照してください。そこでクリス・マリンズの投稿が言及されていますが、それは失われています。投稿の1つのキャッシュバージョンがあるWebアーカイブへのリンクがあり、それを探します。

更新:Chris Mullinsの投稿のメモを見つけました:

一部のラボでは、巨大なIA64サーバーを使用してかなりのスケーラビリティテストを行いました。その結果と、私たちが思いついた多くのベストプラクティスについては、http: //www.coversant.net/Default.aspx?tabid = 88&EntryID=10で詳しく説明しています。

ここにアーカイブされたコピーを参照してください:http://nleghari.wetpaint.com/page/Windows+Sockets+and+Threading%3A+How+well+does+it+scale%3F

私はまだ開発中の同様のアプリケーションに頭を悩ませています。これまでに学んだ、頭に浮かぶポイント:

  • Socket非同期操作(Begin *、End *、* Async)はIOCPを使用します。
  • TPLは、マルチスレッドを実装するための簡単で堅牢な方法です。
  • 非同期が必要な場合は、リクエスト処理用のタスクを作成する必要があります。おそらく、軽量であることが「知られている」リクエストを除いて。
  • を使用してLongRunningタスクを作成するとhundreds or maybe thousands of requests at the same time、その数のスレッドがシステムをひざまずく可能性があります。必要に応じてLongRunningを使用してください。TaskScheduler同時実行制御にはカスタムを使用します。
  • キューは必然的にコードに表示されます。過剰なロックやコンテキストスイッチを回避するためのバッチ処理の場合、または生産者/消費者シナリオの場合。
  • 一部のリソース(SQL Server、ファイルシステムなど)には、IOCPも使用する非同期APIがあります。一部のリソースはそうではありません。前者の場合、.FromAsyncはIOCPを効果的に使用します。ただし、IOCPスレッドプールも無制限ではないことに注意してください。DBクエリやネットワークサービスによって使い果たされる可能性があります。
  • 可能であれば、アプリ内キャッシュ(.NETMemoryCacheまたはカスタム)を実装するか、応答を必要としないDBリクエストをバッチ処理する(たとえば、一括挿入を行う)ことで、DBアクセスを完全に回避します。
  • 部分的に.NET4.5Asyncの一部となったParallelExtensionsExtrasオープンソースライブラリがあります。したがって、.NET4.0でNeetTPL拡張機能を使用できます。ツアーを見るParallelExtensionsExtrasのツアー

c#非同期ソケットサーバーには、ナイーブでバグのある実装がたくさんあります。読んでください、しかし再確認してください。

于 2013-01-17T18:53:32.687 に答える