1

ショートメッセージのストリームを複数のポートでリッスンするC++クライアントアプリケーションを設計しています。ACE、POCO、boost :: asio、およびすべてのProactorのようなデザインパターンを読んだ後、boost::asioから始めようとしています。

非同期ソケットIOを使用するという一定のテーマに気付いたのですが、非同期ioが解決する問題の説明をまだ読んでいません。これらのデザインパターンはすべて、HTTP Webサーバーの設計を前提としていますか?

Webサーバーは、複雑な遅延の影響を受けやすい並行ソケットプログラミングの最も一般的なアプリケーションであるため、これらのパターン/イディオムのほとんどがこの1つのアプリケーションに適合しているかどうか疑問に思い始めています。

私のアプリケーションは、短く頻繁なメッセージのために少数のソケットをリッスンします。別のスレッドは、処理のためにすべてのメッセージを組み合わせる必要があります。私がデザインパターンを検討していることの1つは、接続管理をデータ処理から分離することです。切断後に再接続を試行し、何も起こらなかったかのように処理スレッドを続行するための接続が必要です。ここで推奨されるデザインパターンは何ですか?

私の場合、非同期ioがパフォーマンスをどのように改善するかわかりません。

4

2 に答える 2

3

あなたは正しい方向に進んでいます。特に非同期およびイベント駆動型に関するすべての誇大宣伝で「なぜ」と尋ねるのは賢明です。Web以外のアプリケーションもあります。メッセージキューや高頻度取引などの金融取引を検討してください。基本的に、待機にお金がかかるか、顧客にサービスを提供する機会を失うときはいつでも、非同期の候補になります。ネットワークはデータベースよりもはるかに高速であるため、Webは大きな例です。いつものように、アプリに「これは意味がありますか」と尋ねます。非同期は、その恩恵を受けていない場合、多くの複雑さを追加します。

メッセージ間の平均時間が各メッセージの処理に必要な時間に匹敵する場合、特にその処理に永続性が含まれている場合、短くて高速なメッセージは実際には非同期から多くの利益を得る可能性があります。しかし、急いで非同期にする必要はありません。ブロッキングコードをインストルメント化して、本当にボトルネックがあるかどうかを確認します。

これがお役に立てば幸いです。

于 2012-07-22T17:37:56.320 に答える
2

ブロッキング呼び出しパターンを使用すると、次のことが必要になります。

1. Listening on a socket vector of size N
2. When a message arrives, you wake up with a start in time K, find and start processing the message, employing a time T (it does not matter if the processing is offloaded to another thread: in this case T becomes your offloading time)
3. You finish examining the vector and GOTO 1

したがって、Mメッセージが到着し、K + M * Tディスパッチ時間中に別のメッセージが到着した場合、M+1番目のメッセージはK+M*T時間待機していることになります。これは、K(一定)、M(トラフィックの関数)、およびT(リソースとシステム負荷の関数)の期待値に対して許容できますか?

非同期処理は、まあ、実際には存在しません。どこかに常に「同期」IOループがありますが、それだけがカーネル(またはハードウェア)に十分に統合されているため、自分のIOループよりも10〜100倍高速に実行されるため、大きな値を使用すると拡張性が向上する可能性があります。遅延はまだK1+M * T1の形式ですが、今回はK1とT1がはるかに低くなっています。または、K1が少し高く、T1が大幅に低い場合があります。アーキテクチャは、Mの値が大きい場合に「より適切にスケーリング」します。

Mの値が通常低い場合、非同期性の利点は比例して小さくなります。アプリケーションの存続期間中にメッセージが1つしかないという不条理なケースでは、同期または非同期でほとんど違いはありません。

別の要因を考慮に入れてください。メッセージの数が非常に多くなる場合、非同期性には利点があります。ただし、メッセージ自体が独立している場合(メッセージAによって引き起こされた変更がメッセージBの処理に影響を与えない場合)、同期を維持して水平方向にスケーリングし、それぞれが分数M/Zを受け取る「メッセージコンセントレーター」の数Zを準備できます。総トラフィック。

処理で他のサービス(キャッシュ、永続性、情報取得、認証など)への他の呼び出しを実行し、Tファクターを増やす必要がある場合は、マルチスレッドまたは非同期に切り替える方がよいでしょう。マルチスレッドを使用すると、Tをその値の一部に削減できます(ディスパッチ時間のみ)。ある意味で非同期は同じことをしますが、さらにシェービングし、より多くのプログラミング定型文を処理します。

于 2012-07-22T20:07:23.357 に答える