web-dev-qa-db-ja.com

使用する並列パターンはどれですか?

異なるメールサーバー/メールボックスからメールを取得し、これらのメールを処理/分析するサーバーアプリケーションを作成する必要があります。伝統的に、私はこれをマルチスレッドで行い、メールをフェッチするためのスレッド(またはメールボックスごとに1つ)を起動して、メールを処理していました。

8つ以上のコアがあるサーバーにますます移動するので、これらのコアを可能な限り使用します(1つを100%で使用せず、他の7つはそのままにしておきます)。したがって、概念的には、例として、2つのコアがメールを「継続的に」フェッチし、4つのコアがメールを「継続的に」処理/分析するようにアプリケーションを作成できるといいでしょう(メールの処理と分析がより多いため)メールのフェッチよりもCPUに負荷がかかります)。

これは良い概念のように見えますが、いくつかの並列パターンを検討した後、これがどのように最適に実装されるのか本当にわかりません。実際に適合するパターンはありません。私はVS2012、ネイティブC++で作業していますが、設計の観点からは、これは実際には問題ではなく、これを整理する方法についてのいくつかの指針は素晴らしいと思います!

6
Wim Van Houts

同時実行のアクターモデルは、これに適しているようです。

モデル

このモデルに慣れていない場合は、次のようになります。

アクターはループで実行されるスレッドです。各アクターには、プロデューサー/コンシューマーメッセージキューがあります。外部コードと他のアクターは、メッセージを送信する(メッセージキューにキューイングする)ことでアクターと通信します。

アクターのスレッドは、メッセージキュー内のメッセージの待機をブロックします。1つが表示されると、アクターはそれを処理し、ループバックして次のメッセージを処理または待機します。繰り返す。

注:「俳優」は「エージェント」と呼ばれることもありますが、その用語は誤って適用されています。詳細については、以下のコメントスレッドを参照してください。

アーキテクチャ

メッセージをダウンロードするためのアクター(たとえば、メールサーバー/メールボックスごとに1つ)と、ダウンロードされた電子メールを処理するための他のアクターを作成できます。

2つを接続すると、ダウンロードアクターファイルからダウンロードされたメールファイルへの参照を受信し、利用可能な処理アクターに各参照を送信するか、他のすべての処理アクターがビジー状態の場合は別のルーティングアクターを起動して処理する単一のルーティングアクターを持つことができます。処理アクターが処理を完了すると、処理アクターは、処理が完了したことを示すメッセージをルーティングアクターに送信し、ルーティングアクターは、処理のために別のメッセージを送信できることを認識します。

私はこの時点で、C++のアクター用のライブラリがあることに賭けています[PDATE:以下の@ rwongによるコメントを参照]。他のすべてが失敗した場合は、Erlangを試すことができます;)

C++スレッド化ライブラリがどのように機能するか(それらがスレッドを単一コアまたは複数コアにマップするかどうか)はわかりませんが、これが機能しない場合は、同じ概念を使用して、スレッドを使用する代わりに、個別のプロセスを使用して、通信に何らかのメッセージパッシングフレームワークを使用します。


編集:ただし、ネットワークでボトルネックが発生するので、一度にすべてのコアを占有することは意味がありません(処理に時間がかかる場合を除く)。 。

編集:回答の拡張と用語の修正(エージェント->アクター)

3
paul