2012-02-20 14 views
1

数か月後に私はアプリケーションを水平に分割する必要があります。私のアプリケーションには、CPUとメモリの負荷が必要な特定のサービスがあります。拡張性のために、複数のJVMに分割したいと思っています。水平シャーディング、Java EE&JNDI

私はパーティション化する必要があるサービスをカプセル化するEARを持っています。私がこれを行うと、サービスのクライアント(UIなど)はサービスの特定のインスタンスに対処できる必要があります。たとえば、Accountという名前のサービスがあるとしますが、実際にはそのサービスのインスタンスが3つの異なるJVM(ただし、すべて同じJava EEドメイン内)で実行されています。アカウントIDから特定のVMにマッピングできるサービスロケータがあると仮定すると、その特定のアカウントにサービスできるEJBにはどのようにアクセスしますか?

私が見ることができる潜在的な解決策は、アプリケーションコンテナが別々のアプリケーションでEJBに与えるJNDI名を利用することです。私は別の名前でモジュールを3つの異なる時間を展開する場合、私は彼らに取得するためにJNDIルックアップを行うことができます。

のjava:グローバル/ AccountServer1/AccountFacade

のjava:グローバル/ AccountServer2/AccountFacade

のjava: accountFacadeに到達するために依存性注入を使用することはできませんでした。私はAccountLocator EJBを使用してAccountIDを取得し、Accountアプリケーションの1つにマッピングする必要があります。私が厄介なことをしたいのであれば、おそらく、メソッドの引数がどのサーバーを使用するかを特定できると仮定して、ルックアップを透過的に行う「ローカル」アカウントファサードを実装できます...

このアプローチは実行可能ですか?より良い選択肢はありますか?

答えて

0

アーキテクチャの青写真としてHibernate Shardsを見たり、フレームワークを直接使用したりすることができます。つまり、セッションインタフェース(JPAの場合はEntityManager)の背後にあるシャーディングを隠します。