0

以下は、アプリケーションの観点からの私のシナリオです。

2 つのアプリケーション (.war) ファイルがアプリケーション サーバー (主に Tomcat 8) の同じインスタンスで実行されます。本番環境では、App1 を 100 台のサーバーにデプロイし、App2 は 100 台のうち 50 台のサーバーにのみデプロイできます (App2 は必要ありません)。たくさん配布されます)

現在、この 2 つのアプリケーション (.war) は、共通のカスタム jar (いくつかのユーティリティ クラス) に依存しています。

アプリで Jcache API と hazelcast の実装を使用する予定です。pom.xml に次の依存関係を追加しました

<!-- JSR 107 JCache -->
    <dependency>
        <groupId>javax.cache</groupId>
        <artifactId>cache-api</artifactId>
        <version>1.0.0</version>
    </dependency>
    <!-- Hazelcast dependency -->
    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast</artifactId>
        <version>3.4</version>
    </dependency>

計画では、App1 と App2 で共有されるこの共通のカスタム jar にユーティリティ CacheManager を記述します。

インメモリ クラスターを使用しているため、 hazelcast サーバー プロバイダーのみを使用する予定です。つまり、キャッシュはアプリケーション メモリ内に配置されます。

以下は私のコードのスニペットです。

public class PPCacheManager {

// Loads the default CacheProvider (HazelCast) from hazelcast.xml which is
// in classpath
private static CachingProvider defaultCachingProvider = Caching.getCachingProvider(); //
// Loads the default CacheManager from hazelcast.xml which is in classpath
private static CacheManager defaultCacheManager = defaultCachingProvider.getCacheManager();
// Some more code goes here...

私のhazelast.xml

<hazelcast xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.hazelcast.com/schema/config
                           http://www.hazelcast.com/schema/config/hazelcast-config-3.4.xsd"
       xmlns="http://www.hazelcast.com/schema/config">



<cache name="commonClientCache">
    <key-type class-name="java.lang.String"></key-type>
    <value-type class-name="java.lang.Object"></value-type>
    <statistics-enabled>true</statistics-enabled>
    <management-enabled>true</management-enabled>
    <read-through>true</read-through>
</cache>
</hazelcast>

今、私はこのアプローチについていくつか質問があります。

  1. これはインメモリ キャッシングを実装する良い方法ですか (現在、クラスター キャッシングを探していません)、このコードは共通のカスタム jar または別の場所にある必要がありますか?

  2. ロードする予定の DB からのマスター データがいくつかあるので (両方のアプリケーションでこのデータが必要です)、このデータをメモリにロードする方法と場所がわかりません。注: 遅延読み込みはしたくありません。このマスター データを最初にロードします。

  3. このキャッシュは両方のアプリケーションで共有されるため、メモリ リークの問題を回避するには、キャッシュ シャットダウン コードをどこに追加する必要がありますか。

アップデート

また、このアプローチを実装することで、アプリケーションごとに 2 つのキャッシュのコピーが作成されますか、それとも 1 つのコピーが両方で共有されますか?

私はすでにこのアプローチをアプリケーションに実装しており、Hazelcast 管理コンソールから、キャッシュが 1 つだけ作成されていることがわかりますが、このキャッシュで GET が 2 回実行されていることがわかります。

4

1 に答える 1

0

Hazelcast は、あなたがやろうとしていることに対する完璧なソリューションです。間違いなく遅延読み込みはありません。共有メモリがある場合は、そのようなものは必要ありません。

1 つの (Tomcat) JVM 内にあるインスタンスの数に関しては、Hazelcast を 2 回インスタンス化すると 2 つになります。ポートを自動インクリメントします。ただし、クラスター名が同じである限り、どちらも同じクラスターに属します (「キャッシュ」と呼びます)。したがって、少しばかげている (単一の JVM でのシャーディング) 以外は問題ありません。これを回避するには、HazelcastClient をインスタンス化するように war の 1 つを構成できます。ユーティリティ jar は同じにすることができます。それはすべて、たとえばSpring構成にある必要があります-すべての戦争には独自のコピーがあります。または、その構成を 2 つの外部ディレクトリに入れて、catalina クラスパスに追加することもできます。

シャットダウン コードは、Hazelcast をインスタンス化したのと同じ場所に属します。つまり、2 つの戦争には 2 つのシャットダウン コールがあります。高レベルの構成 (または自動配線) Bean の Spring の destroy() で実行するか、Web アプリ セッション リスナーに配置できます。

于 2015-06-06T23:02:26.523 に答える