0

2つのプログラムA、Bがあります。Aが終了したら、Aの結果のデータを使用して、Bにそのことを知らせ、実行を開始してもらいます。

Aは.NETWebアプリケーションです。それはいつも記憶に残っているわけではないと思いますよね?ブラウザから要求された場合にのみ生きていますよね?

以前は、AとBは同じプログラムの2つの機能です。しかし、Bプログラムはビジネス上の理由で失敗することがあります。そして、Bが失敗しなくても、それは時間がかかり、クライアントを長く待ちすぎて不幸にさせます。それで私はBを分離しました。Aをスムーズに使用しているクライアントは満足しています。Bはバックグラウンドでスタッフを行います。

私の現在の設計は次のとおりです。Aが終了すると、Aはデータをデータベースに保存します。BはWindowsサービスです。5分ごとにデータベースをチェックし、新しいジョブが見つかった場合は実行を開始します。A、Bはお互いを知りません。

上司はなぜ5分間アイドル状態なのかと尋ねました。それが私たちのビジネスのいくつかを実装する最も簡単な方法であるため、私は答えました。あまりデザインしませんでした。

それで、私は資料を読みに行きました、そして、Observer Pattern私が望むもののように思われるのを見つけました。何度か読んだ後Observer Pattern、同じプログラムのクラスにしか適用できず、クラスとオブジェクトは記憶に残っていると思います。

私の質問が次のとおりかどうかはわかりません:GOF Design Patterns別のプログラムに適用できますか?

または:RabbitMQのようなものは、このリアルタイム処理の種類の要件をどのように実装しますか?

5分のチェック間隔を非常に短い時間に設定することは想像できません。これはCPUにとって大きな負担です。

編集:私はとについてのこの説明に入りました。これは、検索からこのスレッドを見ている人にとって役立つObserverPublish/Subscribe思います。

http://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript

オブザーバーとパブリッシュ/サブスクライブパターンの違い

オブザーバーパターンでは、トピック通知の受信を希望するオブザーバー(またはオブジェクト)が、イベントを発生させるオブジェクト(サブジェクト)にこのインタレストをサブスクライブする必要があります。

ただし、パブリッシュ/サブスクライブパターンは、通知の受信を希望するオブジェクト(サブスクライバー)とイベントを発生させるオブジェクト(パブリッシャー)の間にあるトピック/イベントチャネルを使用します。このイベントシステムにより、コードは、サブスクライバーが必要とする値を含むカスタム引数を渡すことができるアプリケーション固有のイベントを定義できます。ここでの考え方は、サブスクライバーとパブリッシャーの間の依存関係を回避することです。

これはオブザーバーパターンとは異なり、適切なイベントハンドラーを実装しているサブスクライバーは、パブリッシャーによってブロードキャストされたトピック通知に登録して受信できます。

4

3 に答える 3

1

確かに、オブザーバーパターンはOOクラスを設計するためのものです。プログラム間で機能するパターンの1つは、パブリッシュ/サブスクライブモデルであり、これはあなたの説明に適していると思います。プロセスBは、Aによってトリガーされる特定のイベントをサブスクライブします。これは通常、サービスアーキテクチャによって仲介されます。たとえば、プロセスAとBはWebアプリケーション(またはWCF / MVC / Web API)であり、パブリッシュ/サブスクライブパターンを仲介する3番目のアプリケーションがあります。したがって、Aが完了すると、イベントをpub-subサービスに送信します。pub-subサービスは、そのイベントのすべてのサブスクライバー(この場合はアプリケーションB)に通知を送信します。

このパターンは自分で実装できます。それを実装するNServiceBusなどの.NETフレームワークもあります。

于 2012-06-13T04:01:36.550 に答える
0

「プルモデル」の使用は非効率的であり、リソースを浪費します。パブリッシュ/サブスクライブモデルの方が適しています。この リンクでは、あなたを案内するメモを見ることができます。例はJavaですが、.netを実装するのは簡単です。

于 2012-06-13T04:16:05.227 に答える
0

アプリケーション間のオブザーバーパターンの同等のメカニズムは、リモートメソッド呼び出しまたはリモートプロシージャコールを使用することです(つまり、Javaで呼び出されます)。.Netでは、 WindowsCommunicationFrameworkの下にある必要があります。

アプリケーションAは、WCFによって(非同期の)メッセージをアプリケーションBに送信します。アプリケーションBが最初に自分自身をメッセージの宛先として登録する可能性もありますが、Aが時々クラッシュした場合、それは最善の策ではありません。

于 2012-06-13T04:30:59.000 に答える