Межкластерная индексация#

Плагин интеграции с Сервисом межкластерной индексации (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, то при отсутствии значения будет выброшено исключение IllegalIndexFieldValueException

Аннотация устанавливается над классом сущности. Указывается имя индекса и поля, используемые в качестве ключа. Перед коммитом плагин прочитает значения этих полей и запишет в индекс с указанным именем значение полей и текущий кластер.

Пример:

@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);