1

OOシステムを可能な限り分離するために、私は次のアプローチを考えています。

1)オブジェクトが相互に登録および検出できるサービスのようなRMI/ディレクトリを実行します。彼らはインターフェースを介してこのサービスと話します

2)オブジェクトがメッセージを公開できるメッセージングサービスを実行し、サブスクリプションコールバックを登録します。繰り返しますが、これはインターフェースを介して行われます

3)オブジェクトAがオブジェクトBのメソッドを呼び出したい場合、上記の#1を通じてターゲットオブジェクトの一意のIDを検出し、オブジェクトBのメッセージサービスにメッセージを公開します。

4)メッセージサービスはBのコールバックを呼び出してメッセージを送信します

5)Bは要求を処理し、メッセージサービスでAの応答を送信します

6)Aのコールバックが呼び出され、応答を取得します。

このシステムは実際には可能な限り分離されていると思いますが、次の問題があります。

1)通信は通常非同期です

2)したがって、リアルタイムではありません

3)システム全体の効率が低下します。

この設計が明らかに適用できない他の実際的な問題はありますか?このデザイン全般についてどう思いますか?

4

3 に答える 3

1

カップリングは、単に効率と再利用性のバランスです。システムのモジュールを可能な限り再利用できるようにしたい場合は、間違いなくコストがかかります。

個人的には、結合を強化する可能性があるが、効率を高めるいくつかの重要な仮定を定義するのが最善だと思います。

それらが提供する利点が複雑さのコストに見合わないという理由だけで、日の目を見ることのないデザインパターンがあります。

于 2011-01-01T05:15:11.203 に答える
1

エンタープライズ統合パターン

彼はメッセージ指向ミドルウェアの使用について話しているようです

考慮すべき点がいくつかあります

安全

別の不正なサービスがシステムの主要コンポーネントとして登録されるのを防ぐにはどうすればよいですか。サービスが本人であるかどうかを検証および検証する方法が必要になります。これは、PKIシステムを介して実行できます。システムが完全にイントラネットでホストされている場合は、これを行う必要がないシナリオがあります。その場合、ソーシャルエンジニアリングと不正な従業員が最大の脅威になります。

契約

クライアントはサービスとどのような契約を結びますか?メッセージはすべてXMLとしてシリアル化され、TextMessageとして送信されますか?純粋なバイトメッセージを使用する場合、サービスを複数のプラットフォームで実行する場合は、バイトの順序に注意する必要があります。

同期

ほとんどの開発者は、非同期メッセージを正しく理解して利用することができません。可能な場合は、「同期」メッセージを呼び出す方法を作成することが設計の最大の利益になる可能性があります。私は過去に、タイムアウトとreturnオブジェクトを使用してsendMessageAndWait()メソッドを作成することでこれを行いました。メソッド内で、応答を受信するための一時的なトピックIDを作成し、そのリスナーを登録してから、ロックを使用して、一時的なトピックでメッセージが返されるのを待つことができます。

迷惑メッセージ

サービスが未承諾メッセージをクライアントに送信できるようにする場合はどうなりますか?サービスAで重大なイベントが発生し、クライアントまたは場合によってはWatchDogサービスに通知する必要があります。クライアントが会話を開始せずにクライアントと通信するサービスの共通通信チャネルに設計を登録できるようにします。

フェイルオーバー

クレジットカードを処理する重要なサービスがダウンした場合はどうなりますか?主要なインフラストラクチャが常に稼働していることを確認するには、フェイルオーバーおよびウォッチドッグサービスを実装する必要があります。レジストリ内にサービスのリストを登録すると、レジスタがプライマリサービスを提供し、プライマリが通信を停止した場合にセカンダリサービスにフォールバックできます。または、メッセージ指向ミドルウェアがラウンドロビンメッセージングを処理できる場合は、同じトピックにすべてのサービスを登録できる可能性があります。サービスがいつ終了したかを知る方法を作成することを検討してください。ほとんどのメッセージは非同期であるため、サービスがいつオフラインになったのかを判断するのは困難です。これは、ハートビートとウォッチドッグを使用して実行できます。

私は過去に、通信が必要な大規模システム用にこのタイプのシステムを数回作成しました。あなたや他の開発者がそのようなシステムの長所と短所を理解していれば、それは非常に強力で柔軟になる可能性があります。

私が提供できる最大のアドバイスは、他の開発者向けのツールキットを作成して、サービスの登録方法、フェイルオーバーの実装方法、またはクライアントからのメッセージへの応答方法について考える必要がないようにすることです。これらはあなたのシステムを殺し、他の人にそれが複雑すぎると言わせるようなものです。彼らにとって苦痛がないようにすることで、エンタープライズデザインパターンを理解することで開発者に負担をかけずに、システムを必要な方法で柔軟性と分離性で機能させることができます。

これは象牙の塔の建築家/建築ではありません。彼が「これがどのように行われるのか、今それを行って、私が正しいことを知っているので、それについて私に迷惑をかけないでください」と言ったとしたら、それはそうでしょう。本当にアンチパターンを参照したい場合は、キッチンシンクかもしれません。いや、考えてみると、流し台でもありません。

見つけたらコメントとして投稿してください。 アンチパターン

于 2011-01-01T15:47:59.730 に答える
0

おそらく機能する可能性のある最も単純なものは何ですか?妥当なサイズのルーチンにモジュール化してください。ただし、ジョブを分割するための複数の実装または複数のハードウェアリソースがない限り、インターフェイス、サービス、メッセージ、およびこれらすべてを避けてください。

シンプルにしてから、重要であることが判明した部分をリファクタリングします。

于 2011-01-01T05:15:06.557 に答える