2

タスク:複数のインスタンスで実行できるc#.netを使用してコンソールアプリを作成する必要があります。(スケーラビリティの目的で)

簡単なアプリを作成すれば、これは簡単です。私の現在の問題は、私のアプリにグローバル変数があることです。あなたにこのアプリが何であるかについての考えを与えるため。これはJSONメッセージを受信する小さなプログラムです(メッセージング部分にはRabbitMQを使用しました)。受信したメッセージは、グローバル変数に保存されます。現在、これにより、複数のインスタンスでアプリを実行することが困難になっています。アプリの複数のインスタンスを実行している場合、メッセージが他のアプリで受信される可能性があるためです。これは、RabbitMQのラウンドロビン動作が原因です。(Exchangeの作成、またはルーティングキーはオプションではありません。)

共有メモリまたはMemoryMappedFileを使用してみましたが、どちらも機能しません。

私が念頭に置いているもう1つのことは、DBを使用することです。しかし、これを行うには優れた設計が必要です。誰かがパターン、例、または参照を知っている場合。お知らせ下さい。

皆様からのご回答をお待ちしております。

4

3 に答える 3

1

メモリ マップされたファイルが実際に機能しない場合は、アーキテクチャを少し変更してみてください。メイン コンソール アプリケーション (サーバーのようなもの) を用意します。これにより、必要に応じて他のコンソール アプリケーション (クライアントのようなもの) を生成できます。次に、ローカル プロセス間通信 (またはその他のプロセス間通信メカニズム) に匿名パイプを使用して、メッセージが既に処理されているかどうかをサーバーに確認し、そうでない場合はリストなどに追加します。

于 2012-11-12T20:41:00.613 に答える
1

を使用MemoryMappedFilesしますが、これを行う最も簡単な方法のように見えます (DB を無視します)。なぜあなたのために仕事をしなかったのかわからないのですか?

アプリケーションの各インスタンスは、このファイルに自分自身を「登録」し、データを書き込むファイルの部分を割り当てます。メッセージを受け取ったら、ファイル全体に保存されている他のインスタンスのデータを確認してください。

すべての操作 (インスタンス レジスタ、書き込み、読み取り) に Mutex を使用できます。これにより、データの一貫した全体像が保証されます。

于 2012-11-12T20:33:04.877 に答える
0

必要なアーキテクチャは次のとおりです。

1 コントローラー。これは、キューからメッセージを読み取って割り当てる役割を果たします。

1+ ハンドラー。コントローラーは、負荷に基づいて、必要に応じて 1 つ以上のハンドラーをインスタンス化します。ハンドラーには明確な開始/終了が必要です。つまり、メッセージを実行してメッセージを渡し、そのメッセージが適切に処理されると完全に終了します。


または、Biztalk または同様のメッセージ処理アプリ サーバーを購入してください。それが、それらのものが構築されているものです。

あなたの主な関心事は、実際には信頼性に関するものです。具体的には、メッセージが実際に処理されたことを知ることです。そのため、ハードウェア障害 (データベースなど) に耐えられるストレージ メカニズム、コントローラーとハンドラーの間の通信メカニズム (何でもかまいません)、長時間実行されるプロセスを想定して応答する何らかの方法が必要になります。おそらく、ハンドラーの 1 人が腹を立てていないことを確認するためのハートビート ピースです。確かに、失敗した場合にメッセージをおそらく自動的に再処理する方法です。最後に、システムが過負荷になるのを防ぐために、X 個の数だけを同時に実行するようにハンドラーを調整する方法が必要です。

要するに、メッセージがドロップ、無視、または処理されないようなものでない限り、これは「単純な」アプリではありません。

于 2012-11-12T20:48:24.887 に答える