7

私たちは、次のニーズを特定した Web アプリケーション (イメージ バンクと呼びましょう) を開発しています。

  • アプリケーションは、一連のユーザーで構成される顧客に対応します。
  • 新しい顧客は動的に作成でき、顧客はそのユーザーを管理します
  • お客様は、動的に変更できるさまざまな機能セットを持っています
  • 顧客は、独自の機能を開発して展開することができます。
  • アプリケーションは同種であり、現在のバージョンがありますが、顧客のバージョン リフトは個別に処理できます。
  • アプリケーションは全体として管理する必要があり、顧客は拡張が容易なリソースを共有する必要があります。

質問:これを標準の OSGi フレームワークで構築する必要がありますか?それとも、新しいアプリケーション フレームワーク (Virgo、Aries、または今後の OSGi 標準) のいずれかを使用する方がよいでしょうか?

より多くの背景といくつかの最初の考え:

私たちは、すぐに数百の顧客 (企業) とそれぞれ数百のユーザー (従業員) を持つことを想定している Web アプリを構築しています。それをモジュラーにしたいので、OSGi. 将来的には、顧客自身がアプリケーションにコンポーネントを開発してプラグインする可能性があるため、顧客を分離する必要があります。また、さまざまな顧客にさまざまな機能セットを提供したい場合もあります。

異なるクライアントが同じバンドルを共有している場合、アプリケーションの異なるクライアントに異なるサービス実装を提供する「正しい」方法は何ですか?

アプリ サーバー アプローチ (Virgo を調べました) を使用して、顧客ごとに 1 回ずつ各バンドルを独自の「アプリ」にロードすることができます。しかし、OSGi を採用しているような気がしません。多数のアプリケーションをホストしているわけではなく、サービスの 99% が同じ実装を共有します。すべてのお客様に。また、アプリケーションを 1 つとして管理 (構成、監視など) したいと考えています。

各サービスは、「顧客トークン」プロパティとともに顧客ごとに 1 回登録 (適切に構成) できます。少し面倒なので、エクステンダー パターンまたは ManagedServiceFactory で処理する必要がありますか? また、顧客 A のサービスを登録する前に、それぞれの依存関係の A バージョンを取得する必要があります。

「現在の」顧客は各リクエストで認識され、スレッドにバインドできます。サービスを検索するたびに顧客トークンを提供しなければならないのは少し面倒です。ブループリントのようなコンポーネント フレームワークを使用するのが難しくなります。この問題を回避するには、サービス フックを使用して、登録されている各サービス タイプをプロキシし、プロキシが現在の顧客 (スレッド) に従って適切なインスタンスにディスパッチできるようにします。

上記の回避策 (ハック?) を実装して OSGi エクスペリエンス全体を開始することは、間違った道を進んでいることを示しているように感じます。だから何をすべきか?乙女座に戻る?上で概説したものに似たものを試してみませんか?なんか全然違う?!

ps。ここまで読んでくれてありがとう!;)

4

3 に答える 3

5

ソリューションにはいくつかの側面があります。

まず、さまざまな顧客を構成する方法を見つける必要があります。ConfigurationAdmin の上にソリューションを構築することは、既存の OSGi 標準を可能な限り活用できるため、ここでは理にかなっています。上に何かを構築する理由は、ConfigurationAdmin を使用すると個々のサービスを構成できるためですが、アプリケーション全体 (バンドルのアセンブリ) をより便利に一度に構成できるように、上にレイヤーを追加することをお勧めします。このような構成は、サービスの個々の構成に変換できます。

顧客固有の実装を持つサービスにプロパティを追加することは、非常に理にかなっています。これらは ManagedServiceFactory を使用して設定でき、このプロパティにより、フィルターを使用して適切な顧客のサービスを簡単に検索できます。顧客固有のサービスまたは一般的なサービスを探すフォールバック シナリオを定義することもできます (すべてのサービスがおそらく顧客固有であるとは限らないため)。このようなフィルターを依存関係に明示的に追加する必要があるため、既存の依存関係管理ソリューションを使用して、特定のユース ケースに合わせて拡張することをお勧めします。これにより、手動で指定しなくても、依存関係によって適切な顧客固有のフィルターが自動的に追加されます。ここでさらに詳しく説明する必要があるかもしれませんが、お知らせください...

次の問題は、アプリケーション内で顧客の「コンテキスト」を追跡する方法です。伝統的に、ここにはいくつかのオプションしかなく、スレッド ローカル コンテキストが最もよく使用されます。ただし、スレッドを顧客にバインドすると、実装オプションの点で制限される傾向があります。一般的には、開発者がスレッド自体を作成することを禁止する必要があり、特定のタスクをワーカー スレッドのプールにオフロードするのが難しいことを意味します。リモート サービスを使用することにした場合、状況はさらに悪化します。これは、コンテキストが完全に失われることを意味します。

したがって、あるコンポーネントから別のコンポーネントに顧客 ID を渡すには、個人的に次のようなソリューションを好みます。

  1. リクエストが (HTTP サーブレットなどで) 受信されるとすぐに、何らかの方法で顧客 ID を特定します。
  2. その ID をサービス依存関係のチェーンに明示的に渡します。
  3. 単一のバンドルの境界内でスレッド ローカルを使用するようなソリューションのみを使用してください。たとえば、顧客を追跡するためにこれを必要とするバンドル内のサード パーティ ライブラリを使用している場合です。
于 2011-02-09T09:10:01.683 に答える
1

VirgoはEquinoxに基づくOSGiコンテナーであることに注意してください。したがって、Virgo固有の機能を使用したくない場合は、使用する必要はありません。ただし、基本的なOSGiアプリケーションであっても、Virgoを使用すると、多くのメリットが得られます。ただし、Virgo Webサーバーに付属しているWebサポートが必要なように聞こえます。これにより、自分でWebサポートを組み合わせる手間が省けます。

完全開示:私はVirgoプロジェクトを主導しています。

于 2011-02-13T03:52:32.817 に答える
1

私はこの同じ問題についてしばらく考えてきました (私はそう思います)。次の類推についてあなたの意見を求めています。

シングル サインオン (SSO) インフラストラクチャを使用してアクセス制御を提供する一連の Web アプリケーションについて考えてみましょう。ユーザーは SSO サーバーを使用して 1 回認証され、要求が届くと、ターゲット Web アプリケーションは SSO サーバーにユーザーが (まだ) 認証されているかどうかを尋ね、ユーザーが承認されているかどうかを判断します。認証情報は、SSO サーバーからも提供される場合があります。

ここで、アプリケーション バンドルをミニ アプリケーションと考えてください。それらは Web アプリケーションではありませんが、SSO 技術を使用して認証を行い、承認情報を提供する何らかの種類の SSO バンドルを用意することは意味がないのでしょうか? すべてのアプリケーション バンドルは、SSO バンドルを使用して認証 (SSO トークン) を検証し、ユーザーがこのアプリケーション バンドルへのアクセスを許可されているかどうかを SSO バンドルに問い合わせて承認を検証するように開発または構成する必要があります。

SSO バンドルは、ある種のセッション リポジトリを維持し、ユーザー プロパティ (このユーザーの (何らかの) データ リポジトリを識別するための情報など) も提供します。この方法では、(意味のある)「カスタマー サービス トークン」を通過するのではなく、SSO バンドルによって提供および管理される不可解な SSO トークンを通過します。

于 2011-02-09T22:02:47.750 に答える