6

MSMQ から読み取り、ワーカー スレッドでそのメッセージを処理するエージェントに割り当てるメッセージの種類に基づいて、C# で記述された Windows サービスがあります。アプリケーションはエージェントなしで開始され、メッセージが MSMQ に到着すると実行時に動的に作成されます。

これがどのように機能するかの基本的な図は次のとおりです。

ここに画像の説明を入力

エージェント ワーカー スレッドが作業でビジー状態の場合、メッセージはそのローカル キューに入れられます。ここまでは順調ですね。ただし、何らかの理由でサービスが停止すると、ローカル キューの内容が失われます。

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

この問題に対してどのようなアプローチが可能ですか?

4

3 に答える 3

3

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

ただし、実際のメッセージングを使用するのではなく、マルチスレッドコードでディスパッチャを実装することを選択しています。

むしろ、各処理エージェントは、独自の物理メッセージキューを備えた自律プロセスである必要があります。これは、障害が発生した場合のメッセージの耐久性を提供するものです。また、処理エージェントのインスタンスをさらにホストするだけでスケーリングできます。

于 2012-07-18T07:18:30.460 に答える
1

Redis に依存する同様のシステムを構築しました。アイデアは、それがメモリを提供することです-アプリケーションの残りの部分から分離された高速データアクセスであり、私のサービスがシャットダウンしてもシャットダウンしません。さらに、最終的にはデータをディスクに永続化するため、信頼性と速度の間で適切な妥協点が得られます。

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

于 2012-07-18T07:12:17.610 に答える
0

Agentaとagentbのメッセージを受信するために2つの新しいmsmsキューを作成し、メインキューからコマンドを(トランザクションで)フェッチしてメッセージを適切なエージェントキューにディスパッチする新しいエージェントを作成してみませんか?

于 2012-07-18T07:17:59.830 に答える