0

Javaコードでmemcahceインスタンスを動的に区別するためのデザインパターンを提案できる人はいますか?

以前の私のアプリケーションでは、このように構成されたmemcacheインスタンスは1つだけです

ステップ1:

dev.memcached.location = 33.10.77.88:11211

dev.memcached.poolsize = 5

ステップ2:

次に、次のようにコードでそのmemcacheにアクセスしています。

private MemcachedInterface() throws IOException {

    String location =stringParam("memcached.location", "33.10.77.88:11211");

    MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(location));

}

次に、上記のMemcachedInterface()を使用して、コードで次のようにそのmemcacheを呼び出しています。

ステップ-3:

MemcachedInterface.getSoleInstance();

そして、私はそのMemcachedInterface()を使用して、次のようにデータを取得/設定しています。

MemcachedInterface.set(MEMCACHED_CUSTS、 "{}"); resp = MemcachedInterface.gets(MEMCACHED_CUSTS);

私の質問は、アーキテクチャに新しいmemcacheインスタンスを導入した場合、構成は次のように行われます。

ステップ1:

dev.memcached.location = 33.10.77.89:11211 dev.memcached.poolsize = 5

したがって、最初のmemcacheインスタンスは33.10.77.88:11211にあり、2番目のmemcacheインスタンスは33.10.77.89:11211にあります。

これまでは大丈夫です...しかし....

この場合のステップ2とステップ3の処理方法、MemcachedInterfaceを動的に取得するには。

1)ステップ2でMemcachedInterface2()と呼ばれるもう1つのインターフェイスを使用する必要があります

今、実際の問題が発生します、

私のアプリケーションには4つのWebサーバーがあります。以前はすべてMemcachedInterface()に書き込んでいますが、ここでもう1つのmemcacheインスタンスを紹介しますex:MemcachedInterface2()ws1とws2はMemcachedInterface()に書き込み、ws3とws4はexに書き込む必要があります:MemcachedInterface2()

したがって、上記のようにMemcachedInterface2()と呼ばれるもう1つのインターフェイスを使用する場合、

WS3とWS4を使用するすべてのクラスをEx:MemcachedInterface2()に変更する必要があるため、これはコードの負担になります。

誰かが限られたコード変更で1つのアプローチを提案できますか?

4

3 に答える 3

0

xmemcached は、クライアントがプールから適切な memcached サーバー インスタンスを選択できるようにする一貫したハッシュをサポートしています。もう少し詳細については、この回答を参照してください。クライアントは複数の memcache サーバーについて心配する必要がありますか?

だから、私が正しく理解したなら、あなたはしなければならないでしょう

  1. すべての Web アプリケーションで memcached クライアントを 1 つだけ使用する
  2. memcached client の周りに独自のラッパー クラスがあるMemcachedInterfaceため、このインターフェイスにいくつかのメソッドを追加して、サーバーを既存のクライアントに追加/削除できるようにする必要があります。ユーザー ガイドを参照してください (少し下にスクロール): https://code.google.com/p/xmemcached/wiki/User_Guide#JMX_Support
于 2012-10-09T11:42:35.143 に答える
0

すべての memcached サーバー インスタンスを構成内のスペースで区切ってリストする必要があります。

例: 33.10.77.88:11211 33.10.77.89:11211

だから、あなたのコードで(Step2):

private MemcachedInterface() throws IOException 
{
    String location =stringParam("memcached.location", "33.10.77.88:11211 33.10.77.89:11211");
    MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(location));
}

次に、Step3 では何も変更する必要はありませんMemcachedInterface.getSoleInstance();

詳細については、memcached のチュートリアル記事を参照してください。

Memcached を Java エンタープライズ パフォーマンスに使用するパート 1 : アーキテクチャとセットアップ http://www.javaworld.com/javaworld/jw-04-2012/120418-memcached-for-java-enterprise-performance.html

Memcached を Java エンタープライズ パフォーマンスに使用する、パート 2 : データベース駆動型 Web アプリケーション http://www.javaworld.com/javaworld/jw-05-2012/120515-memcached-for-java-enterprise-performance-2.html

于 2012-10-25T22:49:54.130 に答える
0

私が見る限り、並列 Web サービスのように、異なるマシンで重複したコードが実行されています。したがって、それぞれを区別するためにこれをお勧めします。

  1. memcached クライアントをラップするには、Singleton Facade サービスを使用します。(すでにやっていると思います)
  2. カプセル化を使用します。コードから分離するために memcached クライアントをカプセル化します。interface L2Cache
  3. サーバーごとに、グローバル変数で名前を付けます。これらの値は、JVM または独自の構成ファイルを介して jar などを介して割り当てます。JVM:--Dcom.projectname.servername=server-1
  4. このグローバル変数をパラメーターとして使用し、サービスの getInstance メソッドを構成します。
public static L2Cache getCache() { 
if (System.getProperty("com.projectname.servername").equals("server-1"))
   return new L2CacheImpl(SERVER_1_L2_REACHIBILITY_ADDRESSES, POOL_SIZE);
}

あなたのデザインで頑張ってください!

于 2012-10-09T11:54:19.907 に答える