7

私がコンサルティングしているビジネスをサポートする一連のサービスの SOA アーキテクチャを検討しています。以前は、各アプリケーションが共有 MS SQL データベースから必要なものを選択し、それを操作するデータベース統合を使用していました。 Java、.net、Microsoft Access などのモンスター データベースと統合するアプリでは、すべてが密結合されているため、参照整合性がありました。

サービス間のデータ共有をサポートする方法について少し混乱しています。

卸売業者が毎月提供する製品データベースの上にある製品サービスを見てみましょう。ドメイン モデルを構築し、これを Hibernate などを使用してデータベースに配置します。実装に関して言えば、製品は、製品について卸売業者から提供された情報を考慮した大きなオブジェクト グラフです。

ここで、Review サービス、Pricing Service、Shipping Service、および Stock Service が ProductUpdated、ProductAdded、ProductDeleted をサブスクライブするとします。問題は、各サービスが製品に関する情報の一部または一部しか必要としないことです。配送には、寸法と重量のみが必要な場合があります。価格設定には、製品 ID、卸売コスト、ボリューム ディスカウント、現在まで有効な価格のみが必要な場合があります。レビューには、製品 ID、製品名、生産者が必要な場合があります。

製品全体 (ProductUpdated などの適切な非サブスクライバー固有のコントラクト、およびすべての製品オブジェクト グラフを表す適切なスキーマ) を公開し、サブスクライバーに必要なものをドメイン モデルにマップさせる (または、彼らが何をするか) だけが標準的な方法ですか?ドメインモデルさえないかもしれません)...

または、これを書いているときに、おそらく次のように考えています。

Product Service は ProductAdded メッセージを発行します (製品の ID とおそらくタイムスタンプだけの製品の詳細は含まれません)

Pricing Service は ProductAdded をサブスクライブし、RequestPricingForProduct メッセージを発行します

製品サービスは ResultForPricingForProduct メッセージを公開します

うーん..少し良くなったように見えます...しかし、私が識別できる他のサービスとそれらが必要とするものに基づいて、製品サービスの契約を構築しているように感じます.おそらく将来、XYZサービスは何か違うものを必要とします. 私が混乱している場所がより明確になってきていると思うので、そこで停止します...おそらく、公開すべきものは何でも返す方法を公開する必要があるため、上記は機能します。

コメントや指示は大歓迎です。これが中途半端に見えたらごめんなさい。

4

2 に答える 2

5

実際、この問題の解決策はデータを共有しないことだと思います。SOA とは、データがサービスによって所有されていることを意味します。それは、そのデータの技術的権限です。Data On The Inside や Data On The Outsideなど、Pat Helland の記事をいくつか読むことをお勧めします。

これらの異なるサービス間で共有する必要があるのは、プライマリ キー (この例では ProductId) だけです。そうしないと、サービスごとに、トランザクションの一貫性が必要なデータがまとめられます。

「商品」は一つである必要はありません。各サービスは、サービス内の製品の異なるビューを持つことができます。Pricing サービスの場合、productId と price があります。レビュー サービスの場合、productId とレビュー。等々。

これが人々を混乱させ始めるのは、これらすべての異なるサービスからのデータである場合に、UI にこのデータを表示する方法です。ProductService の製品名と ReviewService のレビュー テキストを持つ製品のレビューのリストを表示するにはどうすればよいですか?

その答えは、すべての異なるサービスから UI を構成することです。製品サービスから製品を取得し、レビュー サービスからレビュー データを取得して、そのデータを UI で結合します。

于 2013-06-06T01:58:55.163 に答える
3

私は最近あなたの立場にありました。サービスを介して基礎となるオブジェクトを直接公開する場合の問題は、レイヤー間の結合が増えることであり、サービス指向アーキテクチャーを使用してもほとんど意味がありません。Webサービスにも影響を与えずに、これらのオブジェクトやビジネスルールを変更することはできません。

順調に進んでいるようですね。レイヤーの分離を真剣に考えている場合、最も一般的なパターンは、Webサービス(場合によっては各サービス)専用の新しい個別のメッセージクラスのセットを作成し、内部オブジェクトを前後に変換することです。

この方法でサービスレイヤーを設定する方法の例については、「サービスインターフェイス」パターンを参照してください。サービスのクライアント側には、「サービスゲートウェイ」と呼ばれる反対のパターンがあります。

アプリケーションアーキテクチャガイド2.0には、実行する決定の種類に特化した章全体があります(http://apparchguide.codeplex.com/Wiki/View.aspx?title=Chapter%2013%20-%20Service%20Layer%20Guidelines)。ガイド全体をダウンロードします。

これがあなたに最も関係のある部分です。簡単に言うと、時間をかけて新しい粗粒度のメソッドとメッセージベースのオブジェクトを作成すると、はるかに優れたWebサービスが得られます。

サービスインターフェイスを設計するときは、次のガイドラインを考慮してください。粗粒度のインターフェイスを使用して要求をバッチ処理し、ネットワークを介した呼び出しの数を最小限に抑えることを検討してください。ビジネスロジックへの変更がインターフェイスに影響を与えないようにサービスインターフェイスを設計します。サービスインターフェイスにビジネスルールを実装しないでください。さまざまなタイプのクライアントとの互換性を最大限に高めるために、パラメーターに標準形式を使用することを検討してください。クライアントがサービスを使用する方法について、インターフェイス設計で想定しないでください。オブジェクトの継承を使用して、サービスインターフェイスのバージョン管理を実装しないでください。

于 2009-06-10T02:20:12.147 に答える