2.9. クライアントリスナー
クライアントリスナーは、Data Grid クラスターでデータを追加、削除、または変更されるたびに通知を出します。
たとえば、以下の実装は、指定の場所で温度が変わるたびにイベントをトリガーします。
@ClientListener
public class TemperatureChangesListener {
private String location;
TemperatureChangesListener(String location) {
this.location = location;
}
@ClientCacheEntryCreated
public void created(ClientCacheEntryCreatedEvent event) {
if(event.getKey().equals(location)) {
cache.getAsync(location)
.whenComplete((temperature, ex) ->
System.out.printf(">> Location %s Temperature %s", location, temperature));
}
}
}
Data Grid クラスターにリスナーを追加すると、デプロイメントのパフォーマンスの考慮事項が追加されます。
組み込みキャッシュの場合には、リスナーは Data Grid と同じ CPU コアを使用します。多くのイベントを受信し、大量の CPU を使用してこれらのイベントを処理するリスナーは、Data Grid が使用できる CPU を減らし、その他の操作の速度を低下させます。
リモートキャッシュの場合には、Data Grid Server は内部プロセスを使用してクライアント通知をトリガーします。Data Grid Server は、イベントをプライマリー所有者ノードからクライアントに送信する前に、リスナーの登録先のノードに送信します。Data Grid Server には、クライアントリスナープロセスイベントの速度が遅い場合にキャッシュへの書き込み操作を遅延させるバックプレシャーメカニズムも含まれています。
リスナーイベントのフィルタリング
すべての書き込み操作でリスナーが呼び出されると、Data Grid は多数のイベントを生成し、クラスター内にネットワークトラフィックと外部クライアントの両方を作成できます。これらはすべて、各リスナーに登録されているクライアントの数、トリガーするイベントのタイプ、および Data Grid クラスターのデータ変更によって異なります。
リモートキャッシュが設定された例として、イベントを 10 個生成するリスナーで 10 台のクライアントを登録すると、Data Grid Server はネットワーク全体で 100 個のイベントを送信します。
Data Grid Server にカスタムフィルターを指定して、クライアントへのトラフィックを減らすことができます。フィルターを使用すると、Data Grid Server が最初にイベントを処理して、イベントをクライアントに転送するかどうかを判断できます。
継続クエリーおよびリスナー
継続クエリーを行うことで、一致するエントリーのイベントを受信し、クライアントリスナーのデプロイや、リスナーイベントのフィルタリングの代わりとなる手段を提供します。当然、クエリーには、追加の処理コストがかかる点を考慮する必要がありますが、クライアントリスナーではなく、継続クエリーを使用してキャッシュのインデックス化、クエリーの実行を行っている場合には、価値がある場合があります。