Перейти к содержанию

Примеры

Примеры использования TQE Testcontainers

Пример 1. Запуск кластера TQE c одной grpc-точкой

Определим файл с настройками grpc-точки (simple-grpc.yml):

# порт метрик (обязательный)
core_port: 1111

# адрес grpc-сервера (обязательный)
grpc_listen:
  - uri: 'tcp://0.0.0.0:18182'

# Обозначим, что узел является издателем(grpc-publisher)
publisher:
  enabled: true
  #  настройки подключения к узлам Tarantool
  tarantool:
    user: test-super
    pass: test
    connections:
      # Адреса маршрутизаторов
      routers:
        - "router:3301"

# Обозначим, что также является подписчиком(grpc-consumer)
consumer:
  enabled: true
  tarantool:
    user: test-super
    pass: test
    connections:
      # Список адресов узлов шардов Tarantool
      storage:
        - "master:3301"

Определим конфигурацию узлов Tarantool (simple-queue.yml):

# Credentials
credentials:
  users:
    # Обязательный тестовый пользователь 
    test-super:
      password: 'test'
      roles: [ super ]
    admin:
      password: 'secret-cluster-cookie'
      roles: [ super ]
    replicator:
      password: 'secret'
      roles: [ replication ]
    storage:
      roles: [ sharding ]
      password: storage

# advertise configs for all nodes
iproto:
  advertise:
    peer:
      login: replicator
    sharding:
      login: storage
      password: storage

roles: [ roles.metrics-export ]

# Определим тестовую очередь
roles_cfg:
  app.roles.queue:
    queues:
      - name: test
        deduplication_mode: keep_latest
        disabled_filters_by: [ sharding_key ]
  roles.metrics-export:
    http:
      - listen: 8081
        endpoints:
          - format: prometheus
            path: '/metrics'

groups:
  routers:
    replicasets:
      r-1:
        sharding:
          roles: [ router ]
        # Обязательная роль          
        roles: [ app.roles.api ]
        instances:
          router:
            iproto:
              listen:
                - uri: router:3301
  storages:
    replicasets:
      shard-1:
        replication:
          failover: manual
        sharding:
          roles: [ storage ]

        # Обязательная роль
        roles: [ app.roles.queue ]
        leader: master
        instances:
          master:
            iproto:
              listen:
                - uri: master:3301

Для того чтобы запустить кластер TQE, воспользуемся следующим кодом:

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.junit.Test;
import org.testcontainers.containers.TarantoolContainer;
import org.testcontainers.containers.tqe.GrpcContainer;
import org.testcontainers.containers.tqe.TQECluster;
import org.testcontainers.containers.tqe.TQEClusterImpl;
import org.testcontainers.containers.tqe.configuration.FileTQEConfigurator;
import org.testcontainers.containers.tqe.configuration.TQEConfigurator;
import org.testcontainers.utility.DockerImageName;

public class TestClass {

  @Test
  public void test() {
    final Path grpcConfigPath = Paths.get("path/to/simple-grpc.yml");
    final Path queueConfigPath = Paths.get("path/to/simple.queue.yml");
    final DockerImageName image = DockerImageName.parse("tqe-image-name:tag");

    try (TQEConfigurator configurator =
        FileTQEConfigurator.builder(image, queueConfigPath, Collections.singleton(grpcConfigPath));
        TQECluster cluster = new TQEClusterImpl(configurator)
    ) {
      cluster.start();

      // получим grpc точки
      final Map<String, GrpcContainer<?>> grpc = cluster.grpc();
      Assertions.assertEquals(1, grpc.size());

      // получим узлы очереди
      final Map<String, TarantoolContainer<?>> queue = cluster.queue();
      Assertions.assertEquals(1, queue.size());

      // перезапустим кластер
      cluster.restart(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS);
    }
  }
}

Пример 2. Кластер с отдельными узлами (издатель(publisher)/подписчик(consumer))

Воспользуемся конфигурацией очереди (кластера Tarantool) определенную в примере 1. Определим отдельные конфигурации для grpc-подписчика и grpc-издателя.

Конфигурация для grpc-издателя (simple-grpc-publisher.yml):

# порт метрик (обязательный)
core_port: 1111

# адрес grpc-сервера (обязательный)
grpc_listen:
  - uri: 'tcp://0.0.0.0:18182'

# Обозначим, что узел является издателем(grpc-publisher)
publisher:
  enabled: true
  #  настройки подключения к узлам Tarantool
  tarantool:
    user: test-super
    pass: test
    connections:
      # Адреса маршрутизаторов
      routers:
        - "router:3301"

Конфигурация для grpc-подписчика (simple-grpc-consumer.yml):

# порт метрик (обязательный)
core_port: 1111

# адрес grpc-сервера (обязательный)
grpc_listen:
  - uri: 'tcp://0.0.0.0:18182'

# Обозначим, что также является подписчиком(grpc-consumer)
consumer:
  enabled: true
  tarantool:
    user: test-super
    pass: test
    connections:
      # Список адресов узлов шардов Tarantool
      storage:
        - "master:3301"

Для запуска кластера воспользуемся следующим кодом:

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.junit.Test;
import org.testcontainers.containers.TarantoolContainer;
import org.testcontainers.containers.tqe.GrpcContainer;
import org.testcontainers.containers.tqe.TQECluster;
import org.testcontainers.containers.tqe.TQEClusterImpl;
import org.testcontainers.containers.tqe.configuration.FileTQEConfigurator;
import org.testcontainers.containers.tqe.configuration.TQEConfigurator;
import org.testcontainers.utility.DockerImageName;

public class TestClass {

  @Test
  public void test() {
    final Path publisherConfigPath = Paths.get("path/to/simple-grpc-publisher.yml");
    final Path consumerConfigPath = Paths.get("path/to/`simple-grpc-consumer.yml`");
    final Path queueConfigPath = Paths.get("path/to/simple.queue.yml");
    final DockerImageName image = DockerImageName.parse("tqe-image-name:tag");

    try (TQEConfigurator configurator =
        FileTQEConfigurator.builder(image, queueConfigPath,
            Set.of(publisherConfigPath, consumerConfigPath));
        TQECluster cluster = new TQEClusterImpl(configurator)
    ) {
      cluster.start();

      // получим grpc точки (отдельный для publisher и consumer)
      final Map<String, GrpcContainer<?>> grpc = cluster.grpc();
      Assertions.assertEquals(2, grpc.size());

      // получим узлы очереди
      final Map<String, TarantoolContainer<?>> queue = cluster.queue();
      Assertions.assertEquals(1, queue.size());

      // перезапустим кластер
      cluster.restart(1, TimeUnit.SECONDS, 1, TimeUnit.SECONDS);
    }
  }
}

Пример 3. Манипуляции с отдельными узлами кластера

Для перезапуска или остановки отдельных узлов можно воспользоваться следующим кодом:

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.Set;

import org.junit.Test;
import org.testcontainers.containers.tarantool.TarantoolContainer;
import org.testcontainers.containers.tqe.GrpcContainer;
import org.testcontainers.containers.tqe.TQECluster;
import org.testcontainers.containers.tqe.TQEClusterImpl;
import org.testcontainers.containers.tqe.configuration.FileTQEConfigurator;
import org.testcontainers.containers.tqe.configuration.TQEConfigurator;
import org.testcontainers.lifecycle.Startable;
import org.testcontainers.utility.DockerImageName;

public class TestClass {

  @Test
  public void test() {
    final Path publisherConfigPath = Paths.get("path/to/simple-grpc-publisher.yml");
    final Path consumerConfigPath = Paths.get("path/to/`simple-grpc-consumer.yml`");
    final Path queueConfigPath = Paths.get("path/to/simple.queue.yml");
    final DockerImageName image = DockerImageName.parse("tqe-image-name:tag");

    try (TQEConfigurator configurator =
        FileTQEConfigurator.builder(image, queueConfigPath,
            Set.of(publisherConfigPath, consumerConfigPath));
        TQECluster cluster = new TQEClusterImpl(configurator)
    ) {
      cluster.start();

      // получим grpc точки (отдельный для publisher и consumer)
      final Map<String, GrpcContainer<?>> grpc = cluster.grpc();
      // Остановим все grpc-точки
      grpc.values().parallelStream().forEach(Startable::stop);

      // запустим заново
      grpc.values().parallelStream().forEach(Startable::start);

      // получим узлы очереди
      final Map<String, TarantoolContainer<?>> queue = cluster.queue();

      // Остановим узлы с сохранением состояния
      queue.values().parallelStream().forEach(TarantoolContainer::stopWithSafeMount);

      // Запустим заново
      queue.values().parallelStream().forEach(TarantoolContainer::start);
    }
  }
}