2009-04-16 26 views
3

私たちは、約10の異なるWCFサービスと複数のエンドポイントをそれぞれ1つずつ含むプロジェクトを開発しています。サービスの1つは、メモリにキャッシュされたいくつかの大きなテーブルのデータを保持します。WCF:複数のサービス間でキャッシュされたデータを共有する

別のサービスのデータにアクセスする必要があることが判明しました。キャッシュの2つのコピーを保持するのではなく、これらのテーブルをすべてのサービスで共有できるようにしたいと考えています。

私はいくつかの調査を行い、共有データを格納するためにサービスホストに接続されたIExtensionを使用する方法についていくつかの記事を見つけました。

すべてのサービスが同じWebサイトで実行されている場合、それは機能しますか?それは正しいアプローチですか?それとも私は他の場所で見るべきですか?

答えて

3

キャッシュしているデータが複数のサービスで必要な場合は、いずれのサービスにも属していないと思われます。

キャッシュされているデータがどちらのサービスにも実際には関連していないが、どちらのサービスにも必要なものがある場合は、それ自体の別個のサービスに属している可能性があります。第3のサービスにキャッシュをカプセル化し、必要なデータを取得するためにサービス間呼び出しを実行することを検討しましたか?利点は以下のとおりです。

  1. データベースからキャッシュ全体を何度も読み取る必要性を避けて、元のジレンマを解決します。
  2. キャッシュを1か所にカプセル化し、後で簡単に保守/変更できるようにします。
  3. これにより、別のサービスインターフェイスを途中に置くことによって、他のサービスからキャッシュの実装を抽象化することができます。

私はこれが最良のアプローチだと考えています。唯一の欠点は、サービスからサービスへの呼び出しを行う際の余分なオーバーヘッドですが、データベースからキャッシュ全体を読み取る必要があることは確かに優れています。

また、キャッシュ内のデータがキャッシュを呼び出すサービスの両方と非常に密接に関連している場合、つまり両方のサービスがキャッシュ内のデータを追加/変更する場合は、おそらく2つの既存のサービスを結合する必要があります単一のサービスに

私が言っていることが意味をなさないなら、SOAの原則は私が描いているのはService Autonomyです。

+0

これは、中規模のエンタープライズアプリケーションです。私はサービスの自律性について同意します。データはもともとはいくつかのサービスからDBから読み込まれることを意図していましたが、パフォーマンス上の懸念から、メモリ内のキャッシュに移動したいのです。データは多くのサービスの「コア」なので、非正統ですが、センス。 –

+0

説明をありがとう。個人的には、私は確かに別のサービスにキャッシュをカプセル化し、サービス間の呼び出しを実装します。私はそれに応じて私の答えを更新します。 – razlebe

+1

すべて正しいですが、すべての点で、あまりにも概略的な視点です。私は、サービスメソッドとセキュリティトークンプロバイダの間でセキュリティトークンの検証(アプリケーションレイヤ上で行う場合)を共有する必要があります(共有する必要があります)有効なトークンリスト)。同じことがロギングに関するもので、ロギングは特別なものです。同じエンタープライズバスを介してログすると、簡単に破棄することができます。 –

2

すべてのサービスが同じアプリケーションの一部である場合、共有オブジェクト参照を介して直接キャッシュを共有できない理由はありません。これを行う最も簡単な方法は、静的フィールドを使用する方法です。

この方法を選択すると、スレッドの安全性に非常に注意する必要があります。キャッシュに2つのWCFセッションを介して同時にアクセスする場合は、同時に2つのセッションを同時に変更することで、2つのセッションが相互に干渉しないようにする必要があります。キャッシュが読み取り専用の場合、これを行う必要はありませんが、キャッシュの初期化を同期化する必要があります。

+0

通常のasp.netアプリケーションで静的変数メソッドをよく使用していますが、私はサービスのライフサイクルに懸念しています。例えば、サービスAがまだ呼び出されていない(起動されていない)サービスBのキャッシュにアクセスしようとすると、キャッシュは初期化されることが保証されるか? –

+1

初期化コードを静的メソッドまたはキャッシュコントローラ自体に入れる必要があります。これにより、サービスAとサービスBの両方からカプセル化されます。キャッシュを初期化するためにお互いに依存せず、アクセスする最初のものは遅延初期化を引き起こします。 –

関連する問題