Spring Dataを使用したGemFireのガイド
1. 概要
GemFireは、アプリケーションクラスターとバックエンドデータソースの間に位置する高性能の分散データ管理インフラストラクチャです。
GemFireを使用すると、データをメモリ内で管理できるため、アクセスが高速になります。 Spring Data provides an easy configuration and access to GemFire from Spring application.
この記事では、GemFireを使用してアプリケーションのキャッシュ要件を満たす方法を見ていきます。
2. Mavenの依存関係
Spring Data GemFireのサポートを利用するには、最初に次の依存関係をpom.xml:に追加する必要があります。
org.springframework.data
spring-data-gemfire
1.9.1.RELEASE
この依存関係の最新バージョンはhereにあります。
3. GemFireの基本機能
3.1. キャッシュ
GemFireのキャッシュは、重要なデータ管理サービスを提供し、他のピアへの接続を管理します。
キャッシュ構成(cache.xml)は、データが異なるノード間でどのように分散されるかを示します。
...
...
3.2. 地域
データ領域は、単一のデータセットのキャッシュ内の論理的なグループです。
簡単に言えば、データがクラスター内に格納されているノードを考慮せずにa region lets us store data in multiple VMs in the system。
地域は、3つの大まかなカテゴリに分類されます。
-
Replicated regionは、各ノードのデータの完全なセットを保持します。 高い読み取りパフォーマンスが得られます。 データ更新を各ノードに伝播する必要があるため、書き込み操作は遅くなります。
-
Partitioned regionは、各ノードがリージョンの内容の一部のみを格納するようにデータを分散します。 データのコピーは、他のノードのいずれかに保存されます。 優れた書き込みパフォーマンスを提供します。
-
Local regionは、定義しているメンバーノードに存在します。 クラスター内の他のノードとの接続はありません。
3.3. キャッシュをクエリする
GemFireはOQL(Object Query Language)と呼ばれるクエリ言語を提供します。これにより、GemFireデータ領域に保存されているオブジェクトを参照できます。 これは、SQLの構文に非常に似ています。 非常に基本的なクエリがどのように見えるかを見てみましょう。
SELECT DISTINCT * FROM exampleRegion
GemFireのQueryServiceは、クエリオブジェクトを作成するためのメソッドを提供します。
3.4. データのシリアル化
データのシリアル化と逆シリアル化を管理するために、GemFireはJavaシリアル化以外のオプションを提供し、パフォーマンスを向上させ、データストレージとデータ転送の柔軟性を高め、さまざまな言語をサポートします。
それを念頭に置いて、GemFireはPortable Data eXchange(PDX)データ形式を定義しました。 PDXは、オブジェクトを完全に逆シリアル化することなく直接アクセスできる名前付きフィールドにデータを保存することにより、高速なシリアル化と逆シリアル化を提供する言語間データ形式です。
3.5. 関数の実行
GemFireでは、関数はサーバー上に常駐でき、関数コード自体を送信する必要なく、クライアントアプリケーションまたは別のサーバーから呼び出すことができます。
呼び出し元は、特定のデータセットで動作するようにデータ依存関数を指示したり、特定のサーバー、メンバー、またはメンバーグループで動作する独立したデータ関数を導くことができます。
3.6. 継続的なクエリ
連続クエリでは、クライアントはSQLタイプのクエリフィルタリングを使用してサーバー側イベントをサブスクライブします。 サーバーは、クエリ結果を変更するすべてのイベントを送信します。 連続クエリイベント配信は、クライアント/サーバーサブスクリプションフレームワークを使用します。
連続クエリの構文は、OQLで記述された基本的なクエリに似ています。 たとえば、Stockリージョンからの最新の株式データを提供するクエリは次のように記述できます。
SELECT * from StockRegion s where s.stockStatus='active';
このクエリからステータスの更新を取得するには、CQListenerの実装をStockRegion:に添付する必要があります
...
...
...
4. Spring DataGemFireのサポート
4.1. Java設定
設定を簡素化するために、Spring Data GemFireはコアGemFireコンポーネントを設定するためのさまざまな注釈を提供します。
@Configuration
public class GemfireConfiguration {
@Bean
Properties gemfireProperties() {
Properties gemfireProperties = new Properties();
gemfireProperties.setProperty("name","SpringDataGemFireApplication");
gemfireProperties.setProperty("mcast-port", "0");
gemfireProperties.setProperty("log-level", "config");
return gemfireProperties;
}
@Bean
CacheFactoryBean gemfireCache() {
CacheFactoryBean gemfireCache = new CacheFactoryBean();
gemfireCache.setClose(true);
gemfireCache.setProperties(gemfireProperties());
return gemfireCache;
}
@Bean(name="employee")
LocalRegionFactoryBean getEmployee(final GemFireCache cache) {
LocalRegionFactoryBean employeeRegion = new LocalRegionFactoryBean();
employeeRegion.setCache(cache);
employeeRegion.setName("employee");
// ...
return employeeRegion;
}
}
GemFireのキャッシュとリージョンを設定するには、最初にいくつかの特定のプロパティを設定する必要があります。 ここで、mcast-portはゼロに設定されています。これは、このGemFireノードがマルチキャストの検出と配信に対して無効になっていることを示します。 次に、これらのプロパティがCacheFactoryBeanに渡され、GemFireCacheインスタンスが作成されます。
GemFireCache Beanを使用して、Employeeインスタンスのキャッシュ内の領域を表すLocalRegionFatcoryBeanのインスタンスが作成されます。
4.2. エンティティマッピング
このライブラリは、GemFireグリッドに保存されるオブジェクトのマッピングをサポートします。 マッピングメタデータは、ドメインクラスでアノテーションを使用して定義されます。
@Region("employee")
public class Employee {
@Id
public String name;
public double salary;
@PersistenceConstructor
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
// standard getters/setters
}
上記の例では、次の注釈を使用しました。
-
@*Region*,は、Employeeクラスのリージョンインスタンスを指定します
-
@Id,は、キャッシュキーとして使用されるプロパティに注釈を付けます
-
@PersistenceConstructor,これは、複数のコンストラクターが使用可能な場合に、エンティティーの作成に使用される1つのコンストラクターをマークするのに役立ちます
4.3. GemFireリポジトリ
次に、SpringDataの中心的なコンポーネントであるリポジトリを見てみましょう。
@Configuration
@EnableGemfireRepositories(basePackages
= "com.example.spring.data.gemfire.repository")
public class GemfireConfiguration {
@Autowired
EmployeeRepository employeeRepository;
// ...
}
4.4. Oqlクエリのサポート
リポジトリを使用すると、クエリメソッドを定義して、管理対象エンティティがマップされている領域に対してOQLクエリを効率的に実行できます。
@Repository
public interface EmployeeRepository extends
CrudRepository {
Employee findByName(String name);
Iterable findBySalaryGreaterThan(double salary);
Iterable findBySalaryLessThan(double salary);
Iterable
findBySalaryGreaterThanAndSalaryLessThan(double salary1, double salary2);
}
4.5. 関数実行のサポート
また、GemFire関数の実行での作業を簡素化するために、注釈サポートも利用できます。
関数、実装、および実行を利用する際に取り組むべき2つの懸念事項があります。
Spring Dataアノテーションを使用して、POJOをGemFire関数として公開する方法を見てみましょう。
@Component
public class FunctionImpl {
@GemfireFunction
public void greeting(String message){
// some logic
}
// ...
}
@GemfireFunctionを機能させるには、注釈処理を明示的にアクティブ化する必要があります。
@Configuration
@EnableGemfireFunctions
public class GemfireConfiguration {
// ...
}
関数を実行する場合、リモート関数を呼び出すプロセスは、呼び出し引数、関数id、実行ターゲット(onServer、onRegion、onMemberなど)を提供する必要があります。
@OnRegion(region="employee")
public interface FunctionExecution {
@FunctionId("greeting")
public void execute(String message);
// ...
}
関数実行アノテーション処理を有効にするには、Springのコンポーネントスキャン機能を使用して関数をアクティブ化するために追加する必要があります。
@Configuration
@EnableGemfireFunctionExecutions(
basePackages = "com.example.spring.data.gemfire.function")
public class GemfireConfiguration {
// ...
}
5. 結論
この記事では、GemFireの重要な機能を調査し、Spring Dataが提供するAPIを使用して簡単に操作できるようにする方法を検討しました。
この記事の完全なコードはover on GitHubで入手できます。