HTTPリクエストのプリ/ポスト処理のためのTCPベースのデーモンを構築しています。クライアントはApache HTTPD(またはIIS)に接続し、カスタムApache/IISモジュールはさらに処理するためにTCPデーモンに要求を転送します。私のデーモンは大量のトラフィックを処理するためにスケールアップする必要がありますが、大部分のリクエストは小さく短命です。デーモンはC++で構築され、クロスプラットフォームでなければなりません。スレッドプールのスケーラビリティとブースト::アシストのTCPサーバー
私は現在、ブーストasioライブラリを見ていますが、それは自然なフィット感のようです。しかし、スタックレスコルーチンとスレッドプールパターンのメリットを理解するのが難しいです。具体的には、私はここでHTTPサーバの例#3とHTTPサーバの例#4を見ています:http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html
私のグーグルにもかかわらず、私は完全にスタックレスコルーチンサーバのメリットを理解することはできませんマルチコアシステム上のスレッドプールサーバーに関連して実行します。
どちらが私の要件を考慮すると最も適切なのでしょうか?なぜですか?スタックレスコルーチンのアイデアに関するあなたの答えを「愚かにしてください」と自由に感じてください、私はまだここで不安定な地面にいます。ありがとう!
編集:議論のための別のランダムな思考/懸念: ブーストHTTPサーバの例#4が「スタックレスコルーチンを使用して実装シングルスレッドHTTPサーバ」として記載されています。 OK、それは完全にシングルスレッドです(そうです、親プロセスが子プロセスをフォークした後でも、例#4のserver.cppを参照してください)...シングルスレッドはマルチコアシステム上でボトルネックになりますか?どのブロッキング操作でも、他のすべての要求が実行されないようにしています。これが実際の場合、スループットを最大限にするために、私はコルーチンベースの受信データ非同期イベント、内部のブロックタスク(マルチコアを活用するためのスレッドプール)を考えています。そして、非同期で接続を閉じるメカニズム&を送信します。ここでも、スケーラビリティは非常に重要です。何かご意見は?あなたが原因参照、CPUの命令キャッシュ、スケジュール遅延の局所性の相対的な影響を予測することの難しさに、実際に何が起こるかを特定することの効果を測定する必要が
*クエリ*:「スケールアップする」と思っています。 「スケールアウトする」とは何ですか? –
コールーチンのアプローチは、コードが上から下に読み込まれるため、読み込み/実装が簡単です。入力が途切れた後にもう一度ストリームを消費すると、中断していた箇所を心配する必要がないため、ストリーミング解析に適しています。 – avid
@avid - ありがとう、私は、ブーストHTTPサーバーの例#4で、リクエストパーザでどのようにそれをしたのか分かりました。間違いなく良いですが、コーディング/実装の容易さよりもパフォーマンスに関心があります。これについてあなたの考えは何ですか? – Tom