非同期プログラミングは、スレッド・エコノミーによるWebサーバーのスケーラビリティーを実現する方法であり、非ブロッキング・スレッドが非常に少なくても、多くのシミュレート・リクエストを処理できます。たとえば、Node.jsは、非同期操作を使用する単一のスレッドのみを使用してスケーラビリティを実現します。スレッド・スケジューリングによるスケーラビリティ:非同期操作とスレッド・プール上のマルチスレッド・プロデューサ/コンシューマ・キューとの比較
私は現在MongoDbというデータベースを使用していますが、まだ非同期操作をサポートしていない公式のC#ドライバです。したがって、単純なプロデューサ/コンシューマキューを使用してmongodbリクエストを処理してブロッキングスレッドの数を減らすことを検討しています。これは、スレッドプールスレッドがdb要求をキューに挿入し、他のタスクを続行させることによって行われます。キューには、実際のdb要求を処理する1つ以上の専用スレッドがあり、要求が結果とともに返されると、結果はスレッドプールスレッドに渡されます。
しかし、私は現在、スレッドプールがスレッド数に最大限の制限があるため、スレッドプール(TPLとC#4.0のタスク)を使用するときにキューを使用する必要があるのか疑問に思っています。この制限に達すると、要求はスレッドプールスレッドが使用可能になるまでキューに入れられます。あたかもスレッドプールがキューの機能を提供しているかのように、まるで自分のキューを使用することで何も得られないかのようなものですか?
もう1つのすばらしい「C#4.0 in a nutshell」ブック、ページからの次のコメントがあります。 928: "do notブロックルールの例外があります。データベースサーバーを呼び出すときにブロックするのが一般的です。他のスレッドが同じサーバーと競合している場合は、ブロックするのが一般的です。これは、並行性の高いシステムでは、何千もの同時クエリーで終わると、要求が処理できるよりも速くデータベースに当たっていることを意味します。スレッド経済は、あなたの心配の中で最も少ないものです」
他のサーバーへのリクエストなど、他のものでブロックするのと比べて、dbリクエストでブロックするのがなぜ良いのか分かりません。 DBアクセスを必要としないかもしれない他の要求を処理するためにスレッドが解放されるように、データベース要求をブロックしないほうがよいでしょうか。
要約:スレッドプールスレッドの最大数に依存することによって経済性を達成できますか、単純なプロデューサのコンシューマキューを作成する方が良いでしょう。なぜデータベースサーバーへの呼び出しをブロックするのが大丈夫ですか?
ありがとうございました。 BlockingCollectionで一般的なキューの実装を次のように使用することを検討しています。 aarg、コメント内の文字数が少ないので、次の回答を見てください。 – ssn
私は今から40分後に私自身の回答を投稿することができませんので、ハングアップしてください:-) – ssn