Межкластерная индексация#
Плагин интеграции с Сервисом межкластерной индексации (CCIX) Platform V Backend (#BD) собирает изменения сущностей, произошедшие в транзакции, и перед коммитом синхронно вызывает API Сервиса межкластерной индексации (CCIX) для записи значений индексов, сконфигурированных для прикладного модуля. В качестве ключа индекса используется значение какого-либо поля измененной сущности, в качестве значения - идентификатор кластера, установленный с помощью настройки setClusterId. В дальнейшем можно получить идентификатор кластера, соответствующий какому-либо ключу. Это можно использовать для определения кластера, в котором была сохранена та или иная сущность.
Настройка подключения#
Подключение к сервису настраивается с помощью настройки setCciServer, в аргументы нужно передать хост сервера и порт:
configurator.setCciServer("localhost", 80);
Установка текущего кластера#
Для установки идентификатора кластера, с которым работает экземпляр прикладного модуля, нужно использовать настройку setClusterId:
configurator.setClusterId("cluster-id");
Это значение будет использовано в качестве значения индекса при записи в Сервис межкластерной индексации (CCIX).
Установка собственной реализации HTTP-клиента#
Для установки собственной реализации HTTP-клиента нужно использовать настройку setHttpPutImplementor:
configurator.setHttpPutImplementor(implementor);
В качестве реализации можно передать new DelegatedHttpPutImpl(putConsmer), либо полностью реализовать HttpPutImplementor.
Один из сценариев использования данной настройки - проброс HTTP-заголовков для систем мониторинга.
Настройка индексов#
Индексы сущностей конфигурируются при помощи аннотации @ClusterIndex:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(ClusterIndexes.class)
public @interface ClusterIndex {
String name();
String[] fields();
boolean required() default true;
}
Атрибуты аннотации:
Атрибут |
Тип |
Назначение |
|---|---|---|
name |
String |
Имя существующего индекса в сервисе межкластерной индексации |
fields |
String[] |
Массив полей, значения которых будут использованы в качестве ключа индекса |
required |
boolean |
Обязательность заполнения индекса. Если true, то при отсутствии значения будет выброшено исключение |
Аннотация устанавливается над классом сущности. Указывается имя индекса и поля, используемые в качестве ключа. Перед коммитом плагин прочитает значения этих полей и запишет в индекс с указанным именем значение полей и текущий кластер.
Пример:
@Entity
@Getter
@Setter
@Table(name = "PRODUCT")
@ClusterIndex(name = "CCI_PRODUCT_SINGLE", fields = { "partitionKey" }, required = false)
@ClusterIndex(name = "CCI_PRODUCT_COMPOSITE", fields = { "partitionKey1", "partitionKey2" }, required = false)
@ClusterIndex(name = "CCI_PRODUCT_OWNER", fields = { "owner.partitionKey" }, required = false)
@ClusterIndex(name = "CCI_PRODUCT_OWNER_ID", fields = { "owner" }, required = false)
@ClusterIndex(name = "CCI_PRODUCT_OWNER_INH", fields = { "owner.basePartitionKey" }, required = false)
@ClusterIndex(name = "CCI_PRODUCT_OWNER_INH_COMPOSITE", fields = { "owner.partitionKey", "owner.basePartitionKey" }, required = false)
public class Product extends BaseEntity {
@Column(name = "NAME")
private String name;
@Column(name = "CLUSTER")
private Long partitionKey;
@Column(name = "CLUSTER1")
private Long partitionKey1;
@Column(name = "CLUSTER2")
private Long partitionKey2;
@ManyToOne
@Cascade(CascadeType.ALL)
private Owner owner;
}
Получить значение индекса после записи в него можно следующим образом:
String clusterId = cciPlugin.getIndexService(entityManagerFactory).getZone(indexName, indexKey);