2012-07-18 11 views
6

MSMQから読み取り、ワーカースレッドでそのメッセージを処理するエージェントに割り当てるメッセージの種類に基づいて、C#で書かれたWindowsサービスがあります。エージェントのワーカースレッドが仕事をしてビジー状態の場合MSMQ並行処理設計の問題

enter image description here

:アプリケーションはここにそれがどのように動作するかの基本的な数字があるなしエージェントで始まり、メッセージがMSMQ

に到着すると、実行時に動的に作成されていますメッセージはローカルキューにキューイングされます。ここまでは順調ですね。しかし、何らかの理由でサービスが停止した場合、ローカルキューの内容は失われます。

私はこのシナリオを処理する最良の方法が何であるか把握しようとしています。現在、ローカルキューはSystem.Concurrent.ConcurrentQueueです。私はおそらく、Sql Ceのdbまたはその他の永続的なストレージを使用することができますが、私はパフォーマンスが心配です。もう1つのことは、エージェントがメッセージを処理する準備ができているときだけMSMQから読むことですが、MSMQに含まれるメッセージがわからないという問題があります。

この問題を解決するには、どのような方法がありますか?

答えて

1

私はRedisに依存する同様のシステムを構築しました。そのアイデアは、メモリ高速データアクセスをアプリケーションの他の部分から隔離して提供し、サービスが動作するときにはシャットダウンしないということです。さらに、最終的にはデータをディスクに保存するため、信頼性とスピードの間に優れた妥協点が得られます。

各クライアントがRedisでホストされる独自のメッセージキューから読み取るように設計した場合は、キューをサービスのダウンタイムから独立させ、次回のサービス開始時に各ワーカーの負荷を配分できます。

+0

私はここでレディスを使いたいですが、それは過度のことだと思いませんか? – Obaid

+0

全くありません。それは非常に軽いですし、それがうまく設計されたものですから、あなた自身で新しいものを醸造してデバッグするのではなく、あなたのために仕事をすることができるものを使用することができます。 また、メモリマップファイルを使用して、ある種の永続ストレージにすばやくアクセスできますが、いくつかの問題があります。スレッドセーフについてはわかりません。 –

0

Agentaとagentbのメッセージを受け取る2つの新しいmsmsキューを作成し、メインのキューからコマンドをフェッチして適切なエージェントキューにメッセージをディスパッチする新しいエージェントを作成するのはなぜですか?

+0

実際にエージェントは、 MSMQに到着するメッセージ。メッセージのタイプは1からnまで変化します。だから私は、潜在的に不明なタイプのメッセージのための別のキューを作成することはできません。 – Obaid

+0

なぜObaidRなのですか?キューをプログラムで作成することはできますが、潜在的にどのくらい大きいのでしょうか? –

+0

nはおそらく約15〜20になります。しかし、私はメッセージをメッセージタイプに基づいて別々のキューに入れる反対側のシステムを変更する必要があります。私は何とか私のサービスでこれを処理できるかどうか疑問に思っていました。 – Obaid

3

あなたのデザインは基本的に以下のパターンを実装します:http://www.eaipatterns.com/MessageDispatcher.html

しかし、あなたはマルチスレッドコードでディスパッチャを実装するために選択されている、むしろ実際のメッセージングを使用するよりも。

むしろ、各処理エージェントは、独自の物理メッセージキューを持つ自律プロセスでなければなりません。これが失敗の場合のメッセージ耐久性を提供するものです。また、処理エージェントのインスタンスをさらにホストすることで、規模を拡大することもできます。

+0

別々のプロセスが必要なのかどうかわかりません。各エージェントのメッセージキューを別々にすることに同意する(キュー名にメッセージを担当するエージェントにリンクする識別子を含めることを可能にする何らかの規則を使用してプログラムによって作成される)。既に存在するキューを持つエージェント。 –