キャッシュの使用 パーマリンク to " キャッシュの使用"

JHipsterでは、キャッシュは2つのレベルで使用できます。

  • Spring Cache抽象化を使用します。これは、アプリケーションが生成されるときの個別の質問にあり、Spring Bootの@EnableCachingアノテーションを使用します。これは、特定のビジネスニーズに合わせて調整する必要があり、Hibernateの第2レベルのキャッシュよりも高いレベルで動作します。
  • Hibernateの第2レベルのキャッシュを使用します。アプリケーションのパフォーマンスを大幅に向上させることができるキャッシュソリューションであり、JHipsterで一般的に行われている振る舞いです。このオプションは、SQLデータベースで、Spring Cacheの使用を選択した場合にのみ使用できます。

Spring CacheとHibernateの第2レベルのキャッシュは同じキャッシングソリューションを使用しますが、同じレベルでは動作しません。キャッシュの無効化の問題がさらに複雑になるため、同じオブジェクトに対して両方を使用することはお勧めしません。代わりに、次のように使用することをお勧めします。

  • Spring Cacheは、DTOで一般的に使用されるような、上位レベルまたは集約オブジェクト用
  • Hibernate第2レベルキャッシュは、SQLリクエストの数を減らすため、データベースにマップされたエンティティ用

JHipsterは、次のキャッシュ実装をサポートしています。

  1. Ehcache,
  2. Caffeine,
  3. Hazelcast,
  4. Infinispan,
  5. Memcached,
  6. Redis.

詳細は以下のとおりです。

共通の構成 パーマリンク to "共通の構成"

キャッシュはCacheConfigurationクラスで構成され、JHipster共通アプリケーションプロパティを使用しての調整もできます。

Ehcacheを使ったキャッシング パーマリンク to "Ehcacheを使ったキャッシング"

EhcacheはJHipsterのモノリスを備えたデフォルトのキャッシュです。Ehcacheは非常に高速に起動するため、「通常の」モノリスに最適なソリューションです。

JHipsterではEhcacheは分散キャッシュとして動作できません。新しいノードをプログラムで追加できるAPIがないためです。

Ehcacheは、JHipsterの共通アプリケーションプロパティの2つのプロパティ(time-to-live-secondsおよびmax-entries)を定義するCacheConfigurationSpring configuration beanで構成されます。アプリケーション固有のApplicationPropertiesSpring configuration beanには、さらにプロパティを追加できます。

デフォルトでは、time-to-live-secondsのデフォルト値は、devモードとprodモードの両方で3600秒(1時間)です。また、max-entriesのデフォルト値は、devモードで100エントリ、prodモードで1,000エントリです。

これらの値は、特定のビジネス・ニーズに応じてチューニングする必要があります。JHipster監視画面は、アプリケーションでのキャッシュの使用状況をよりよく理解するのに役立ちます。これらの値を調整するには、Ehcacheのドキュメントも参照してください。

Caffeineによるキャッシング パーマリンク to "Caffeineによるキャッシング"

Caffeineは、ハイパフォーマンス準最適キャッシュライブラリであり、JHipsterのモノリスで使用するためのEhcacheの代替です。

Ehcacheと同様に、Caffeineは分散キャッシュとしては動作しません。

Jhipsterは、Ehcacheと同じCaffeineのデフォルト設定を生成します。ただし、追加のオプションを追加して、ニーズに合わせての調整もできます。Caffeineキャッシュ設定はCacheConfiguration Spring configuration beanで行われますが、アプリケーション固有のプロパティはApplicationPropertiesBeanに追加できます。次の3つのファイルは、独自のCaffeine設定を定義するのに便利です。

  • CacheConfigurationBean内のCaffeineConfigurationクラスを使用し、Caffeineプロパティを追加します。

  • TypesafeConfiguratorreference.confとともに、サポートされているすべてのCaffeineプロパティへの参照として使用できます。

Hazelcastを使ったキャッシング パーマリンク to "Hazelcastを使ったキャッシング"

Hazelcastは(Ehcacheのように)ローカルキャッシュとして動作できますが、分散キャッシュとしても動作できます。その結果、次のようになります。

  • マイクロサービスがスケールすることを考慮し、マイクロサービスのデフォルトオプションとなります。
  • ゲートウェイがスケールすることを考慮し、ゲートウェイのデフォルトオプションとなります。Hazelcastはゲートウェイのレート制限情報を配信するために使用されます。
  • モノリス内で使用される場合、Hazelcastは、スケールするためにJHipster Registryを手動で設定する必要があります。

アプリケーションをスケールさせるために、Hazelcastは設定されたサービスディスカバリを使用して新しいノードを見つけ、水平にスケールします。マイクロサービスとゲートウェイでは、これはJHipster RegistryとConsulの両方で動作し、モノリスでは手動で設定したJHipster Registryでのみ動作します。

新しいノードが追加されると、それ自体がサービスディスカバリに登録され(たとえば、JHipsterレジストリで使用可能になります)、同じタイプの他のノードを検索します。同じタイプの1つまたは複数のノードが検出されると、それらを使用してクラスタ化されたキャッシュが作成されます。各ノードのログには、次の例のようなメッセージが表示されます。

[172.18.0.10]:5701 [dev] [3.7]
Members [4] {
Member [172.18.0.10]:5701 - 3cbddfcd-0229-4cd5-be55-4611927a9071 this
Member [172.18.0.5]:5701 - 204d457d-f6fe-43f2-8e8d-497e96b3f08e
Member [172.18.0.14]:5701 - 7804d535-86fb-46be-b2a5-d7801dc6a4df
Member [172.18.0.11]:5701 - 6114ae28-56cd-4840-a575-4d73a6003744
}

Hazelcastとうまく連携するために、JHipsterにはHazelcast Management Centerのサポートが含まれています。

  • これは独自の製品であるため、無料で監視できるのは2つのノードのみであることに注意してください。しかし、アプリケーションのテストとしては十分です。
  • これは、JHipster共通アプリケーションプロパティを使用し、キーjhipster.cache.hazelcast.management-centerを使用して、application-dev.ymlおよびapplication-prod.ymlファイルに設定されます。デフォルトではオフになっています。
  • JHipsterは、Hazelcast Management Centerを実行するためのDocker Compose設定を生成します。Docker Composeドキュメントを読み、docker-compose -f src/main/docker/hazelcast-management-center.yml up -dを使用してアプリケーションを実行してください。

Infinispanによるキャッシング パーマリンク to "Infinispanによるキャッシング"

Infinispanは、インメモリ・ローカル・キャッシュおよびクラスタ・キャッシュとして機能する、高性能なキャッシュ・ソリューションです。複数のキャッシュ・モードをサポートしています。

JHipsterでは以下の用途でInfinispanを使用できます。

  • Spring Cache抽象化の実装として
  • Hibernateの第2レベルのキャッシュとして

事前設定されたデフォルト設定は次のとおりです。

  • エンティティは無効化キャッシュモードで動作します。
  • アプリケーション固有のキャッシュについては、3つのキャッシュ構成が事前に定義されています。
    • local-app-data:ノードにローカルなデータをキャッシュする場合
    • dist-app-data:ノード間(分散レプリカ数によって決定されるコピーの数分)でデータを分散キャッシュする場合
    • repl-app-data:ノード間でデータをレプリケートする場合

JHipsterの共通アプリケーションプロパティを使用すると、キャッシュ内の個々の操作モードのそれぞれに対する削除、存続可能時間、最大エントリ、および分散モードのレプリカ数を調整できます。アプリケーション固有のキャッシュの場合はjhipster.cache.infinispanのプロパティを、Hibernateの第2レベルのキャッシュの場合はspring.jpa.propertiesのプロパティを調整してください。

JHipsterレジストリが有効になっている場合、ノードリストはレジストリから設定されます。JHipsterレジストリが有効になっていない場合、ノードのディスカバリはInfinispan Jar内にパッケージ化されたconfig-fileで定義されたデフォルトのトランスポート設定に基づいて行われます。Infinispanは、Kubernets/OpenShift、AWS、Azure、Googleなど、ほとんどのプラットフォームでディスカバリをネイティブにサポートしています。

Infinispan 9.0.0.Final GA以降のリリースでは、ネイティブのKUBE_PINGディスカバリを使用して、KubernetesおよびOpenShiftでInfinispan組み込みキャッシングアプリケーションを実行するためのサポートが追加されましたが、Hibernateの依存関係はまだ9.xリリースに更新されていないため、ネイティブディスカバリはKubernetesおよびOpenShiftではサポートされていません。ただし、インスタンスディスカバリにJHipsterレジストリを使用することで、アプリケーションを実行できます。

Memcachedを使ったキャッシング パーマリンク to "Memcachedを使ったキャッシング"

Memcachedはオープンソースの分散キャッシュです。これは、JHipsterがサポートする他のキャッシュ実装とは大きく異なります。

  • MemcachedはHibernateの第2レベルのキャッシュとしては動作せず、Spring Cacheの抽象化のみをサポートします。
  • Memcachedはリモートサーバでのみ動作し、ローカルキャッシュはありません。そのため、オブジェクトは常にシリアライズ/デシリアライズされ、ネットワークを通過します。つまり、メモリに収まる小さいオブジェクト集合の場合は、効率が低くなる可能性があります。
  • スケーラビリティがあり、操作が手軽です。Heroku、GCP、AWSなどのほとんどの大手クラウドプロバイダは、Memcachedをサポートしています。そのため、他のキャッシュ実装を使用するよりも、分散できる(かつ手軽な)Memcachedクラスタを使用する方がはるかに簡単です。

JHipsterは、Memcachedで一般的に使われるXmemcachedのJavaクライアントを使用し、通常のJHipster共通アプリケーションプロパティを使用して最も重要なプロパティを設定します。

各キャッシュは、CacheConfigurationconfiguration bean内で特定のSpring Beanとして構成する必要があることに注意してください。

Memcachedはクラスローダー内のオブジェクトをシリアライズ/デシリアライズする必要があるため、Spring Boot devtools(特定のクラスローダーを使用してアプリケーションクラスのホットリロードを行う)を使用する場合には機能しません。これが、Memcachedがdevモードでデフォルトでオフになっている理由です。

JHipsterではいつものように、Docker Compose設定が提供されているので、マシン上でMemcachedサーバを起動できます。これを使用するには、docker-compose -f src/main/docker/memcached.yml up -dを実行してください。

Redisによるキャッシング パーマリンク to "Redisによるキャッシング"

Redisはオープンソースのインメモリデータ構造ストアであり、パフォーマンスの高いキャッシングソリューションとして使用できます。構成に応じて、Redisを単一のサーバノードとして使用するか、分散キャッシュとして使用するかを選択できます。

JHipsterは、主に次の2つの理由から、RedissonをRedis Javaクライアントとして使用しています。

  • Redisによって強く推奨されている
  • JCache (JSR-107)実装を提供する

JCache実装を使用しているため、他のキャッシュとの一貫性を維持し、SpringキャッシュとHibernate第2レベルキャッシュの間で同じRedis接続を共有できます。