2009-06-08 18 views
7

私は相談するビジネスをサポートする一連のサービス用のSOAアーキテクチャを検討していましたが、以前は各アプリケーションが共有MS SQLデータベースから必要なものを選び、私たちはJava、.net、およびマイクロソフトのアクセスを含むモンスターデータベースと統合している様々なアプリを持っていましたが、すべてが緊密に結合されているので、参照整合性がありました。SOAスタイル - データの共有

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

卸売業者によって毎月提供される製品データベースの上に位置する製品サービスを受け取ります。ドメインモデルを構築し、これをHibernateまたはwhatveverを使用してデータベースに格納します。implentation wise Productは、製品に関する卸売業者から提供された情報を与えられた大きなオブジェクトグラフです。

レビューサービス、料金設定サービス、配送サービス、および在庫サービスが、ProductUpdated、ProductAdded、ProductDeletedを購読するとします。問題は、各サービスが製品に関する情報の一部または一部しか必要としないことです。配送には寸法と重量だけが必要です。価格設定には、現在までの製品ID、卸売費、数量割引、価格のみが必要な場合があります。レビューで商品ID、商品名、プロデューサーが必要な場合があります。

ProductUpdatedなどの非加入者固有の契約(適切なスキーマ、すべての製品オブジェクトグラフを表す適切なスキーマ)を公開し、加入者が必要なものをドメインモデルにマップできるようにするのが標準的な方法です一体、彼らがやりたいことも、ドメインモデルを持っていない可能性があります)...

をそれとも私がこれを書いている私は多分考えている:

製品・サービスがProductAddedメッセージを発行します(単に製品の詳細情報が含まれていません製品のIDとおそらくタイムスタンプ)

料金設定サービスsu ProductAddedにbscribesおよび公開するRequestPricingForProductメッセージが

製品・サービスを公開しResultForPricingForProductメッセージ

は、うーん...ちょっと良さそうです...しかし、私は、他のどのような私ができるサービスに基づく製品・サービスの契約を構築してるようには感じています何を求めているのか、将来のXYZサービスでは、おそらく異なるものが必要です。私が混乱しているところではっきりしてきていると思うので、私はそこで止まるつもりです...おそらく上記はうまくいくでしょう。

ご意見やご感想は大変ありがたいです。これは半分焼いて見えて申し訳ありません。

答えて

3

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

正しいトラックにいるようです。レイヤーを分離することに真剣に取り組んでいる場合、最も一般的なパターンは、Webサービス、潜在的には各サービスのためのメッセージクラスの新しいセットを新たに作成し、内部オブジェクトを前後に翻訳することです。

このようにサービスレイヤを設定する方法の例については、「サービスインターフェイス」のパターンを参照してください。サービスのクライアント側には、「Service Gateway」という逆のパターンがあります。

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

ここはあなたに最も関連する部分です。長い話をすると、新しい大雑把なメソッドやメッセージベースのオブジェクトを作成する時間があれば、より良いWebサービスが実現します。

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

5

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

これらの異なるサービス間で共有する必要があるのは、プライマリキー(例のProductId)のみです。それ以外の場合、サービスごとに、トランザクション上一貫性が必要なデータが一緒になります。

「製品」は1つである必要はありません。各サービスは、そのサービスにおける製品の異なるビューを持つことができます。価格設定サービスには、productIdと価格があります。レビューサービスのために、productIdとレビュー。等々。

人が混乱し始めるところでは、これらの異なるサービスからのものであれば、このデータをUIに表示する方法があります。 ProductServiceの製品名とReviewServiceのレビューテキストを持つ製品のレビュー一覧を表示するにはどうすればよいですか?

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

関連する問題