クライアントにデータを「ストリーミング」するための「comet」サーバーを作成する予定です。マルチコア CPU を利用するために過去に 1 つを強化しましたが、今はゼロから始めています。サーバーの電源として epoll/kqueue または libevent を使用する予定です。
私が重視してきた問題の 1 つは、どのサーバー設計を使用するかということです。マルチプロセス モデルを使用してすべての CPU コアを活用することを計画しているため、いくつかのオプションを利用できます。
- 事前にフォークされたマルチプロセス - 独自の受け入れを行う各プロセス
- マスターを使用した事前フォークされたマルチプロセス - マスター プロセスが受け入れ、記述子の受け渡しを使用して、受け入れたソケットをプロセスに渡します。
- 異なるポートを持つ事前フォークされたマルチプロセス - 各プロセスは、同じシステムの異なるポートでリッスンします。ロードバランサーは、個々のデーモン プロセスからの負荷フィードバックに基づいて、次の接続を取得するプロセスを決定します。
設計 #2 は最も複雑です。設計 3 は単純ですが、設計に関係なく追加のハードウェアが必要になります。これは、複数のマシンでこれを実行し、とにかくロードバランサが必要になるためです。設計 1 には雷の群れの問題がありますが、雷の群れは 8 つのプロセスでは大したことではないと思いますが、クライアントが絶えず接続と切断を繰り返している場合 (これはコメット サーバーであるため、これはまれなはずです) は大したことではありません。
私が見たように、#2は複雑で、受け入れごとにマスタープロセスとスレーブプロセスの間で記述子を渡すため、2つの追加のシステムコールが必要です。雷鳴の群れの問題とは対照的に、このオーバーヘッドを持っている方が良いでしょうか? 8 つのプロセスが起動して受け入れを実行している場合、デザイン #1 を使用すると、8 つの受け入れ呼び出しが表示される可能性がありますか?
デザインの選択の長所と短所は何ですか? あなたは何をお勧めします?