Перейти к основному содержимому

Splitter

Назначение

Splitter — сервис, назначающий эксперименты пользователям и разбивающий их на группы. Получает конфигурации экспериментов от Configurator и записывает события распределения в ClickHouse.

Схемы данных

к сведению

Схемы и таблицы в PostgreSQL создаются автоматически при деплое Splitter. Дополнительная настройка не требуется.

Справочно — основные таблицы:

ТаблицаНазначение
markersКонфигурации экспериментов, получаемые от Configurator
segmentsСписки пользователей для таргетирования экспериментов
marks, user_overridesРучные назначения групп пользователям в конкретных экспериментах
global_exclusionИсключение пользователей из всех экспериментов

Деплой

Для установки необходимо заполнить файл с параметрами values-trisigma.yaml

примечание

values.yaml содержит значения по умолчанию — не изменяйте его напрямую, а переопределяйте нужные параметры в отдельных файлах.

Параметры приложения

Хранятся в values-trisigma.yaml. Создайте файл из примера: cp values-trisigma.yaml.example values-trisigma.yaml.

Образ сервиса

ПараметрОписание
image.repositoryОбраз сервиса в Container registry
image.tagТег образа сервиса в Container registry
warning
Не используйте registry.trisigma.io напрямую

Образы необходимо предварительно зеркалировать в ваш собственный Container Registry.

Таймзона

ПараметрОписание
timezoneТаймзона. IANA tz, например Europe/Moscow

Миграции

ПараметрОписание
postgresqlMigrator.image.repositoryОбраз мигратора для PostgreSQL миграций в Container registry

PostgreSQL

ПараметрОписание
postgresql.hostХостнейм для подключения к PostgreSQL БД сервиса
postgresql.portПорт для подключения к PostgreSQL БД сервиса
postgresql.databaseНазвание БД, к которой подключается сервис
postgresql.userУчетная запись для подключения к PostgreSQL

ClickHouse

ПараметрОписание
clickhouse.hostДля записи expose-событий (таблица ab_clickstream)
clickhouse.portПорт для подключения к ClickHouse БД сервиса (native-протокол)
clickhouse.userУчетная запись для подключения к ClickHouse
clickhouse.tls.enabledИспользовать TLS при подключении к ClickHouse

Отправка событий

Запись expose-событий сделана асинхронной и батчевой, чтобы не замедлять ответ на запрос группы.

Обработчик кладёт событие в in-memory буфер сплиттера — очередь фиксированного размера. Операция мгновенная и неблокирующая: если в буфере есть место, событие принимается и ответ возвращается, не дожидаясь ClickHouse. Если места нет — событие отбрасывается. Буфер хранится в памяти и не переживает рестарт пода.

Параллельно фоновый воркер периодически отправляет накопленные события в ClickHouse одним батчем — по таймеру либо по достижении порога заполнения буфера.

Вставка выполняется через async_insert с подтверждением. При временных ошибках1 батч переотправляется несколько раз с нарастающим backoff; если отправка не удалась — события возвращаются в буфер. При нескольких неудачных отправках подряд срабатывает circuit breaker, и отправка временно приостанавливается.

ПараметрОписание
clickhouseEventsSending.bufferSizeРазмер буфера событий в памяти (количество событий)
clickhouseEventsSending.flushIntervalMsПериод планового сброса буфера в ClickHouse, мс
clickhouseEventsSending.flushThresholdPercentПорог заполнения буфера (%), при котором сброс запускается досрочно
clickhouseEventsSending.cbFailureThresholdЧисло неудачных отправок подряд, после которого срабатывает circuit breaker
clickhouseEventsSending.cbRecoveryTimeoutMsПауза перед повторной попыткой отправки после срабатывания circuit breaker, мс

Фоновые задачи (Crons)

ПараметрОписание
crons.image.repositoryОбраз планировщика фоновых задач в Container registry
КронОписание
overrides_watcherЧистит устаревшие и истёкшие ручные назначения групп пользователям
configs_watcherУдаляет устаревшие конфигурации экспериментов и сегментов пользователей

Секреты приложения

Секреты в приложение можно передать двумя способами: задать значения напрямую в secrets-values.yaml — или указать имя существующего Kubernetes Secret в поле existingSecret в чарте (например, созданного через Vault или External Secrets Operator).

Создайте файл из примера: cp secrets-values.yaml.example secrets-values.yaml.

PostgreSQL

СекретКлючОписание
PGPASSWORDpostgresql.passwordПароль для подключения к PostgreSQL

ClickHouse

СекретКлючОписание
CLICKHOUSE_PASSWORDclickhouse.passwordПароль для подключения к ClickHouse

Межсервисная авторизация

СекретКлючОписание
CONFIGURATION_TOKENinterServiceAuth.configurationTokenТокен для авторизации запросов от Configurator2

Публичный API

СекретКлючОписание
USER_TOKENpublicApi.userTokenТокен для авторизации запросов для публичных эндпоинтов3
ROTATABLE_USER_TOKENpublicApi.rotatableUserTokenОпциональный. Второй слот для бесшовной ротации USER_TOKEN
Ротация USER_TOKEN
  1. Задайте новый токен как ROTATABLE_USER_TOKEN
  2. Обновите клиентов на новый токен
  3. Перенесите его в USER_TOKEN и очистите ROTATABLE_USER_TOKEN

Лицензия

СекретКлючОписание
LICENSE_KEYlicense.licenseKeyЛицензионный ключ Trisigma Enterprise

Использование существующего Secret (existingSecret)

Если вы не хотите передавать значения через secrets-values.yaml — укажите название вашего собственного Secret:

kubectl create namespace trisigma-splitter

kubectl create secret generic trisigma-splitter-secrets \
--from-literal=PGPASSWORD='...' \
--from-literal=CLICKHOUSE_PASSWORD='...' \
--from-literal=CONFIGURATION_TOKEN='...' \
--from-literal=USER_TOKEN='...' \
--from-literal=LICENSE_KEY='...' \
-n trisigma-splitter
postgresql:
existingSecret: trisigma-splitter-secrets
secretKeys:
passwordKey: PGPASSWORD
clickhouse:
existingSecret: trisigma-splitter-secrets
secretKeys:
passwordKey: CLICKHOUSE_PASSWORD
interServiceAuth:
existingSecret: trisigma-splitter-secrets
secretKeys:
configurationTokenKey: CONFIGURATION_TOKEN
publicApi:
existingSecret: trisigma-splitter-secrets
secretKeys:
userTokenKey: USER_TOKEN
rotatableUserTokenKey: ROTATABLE_USER_TOKEN
license:
existingSecret: trisigma-splitter-secrets
secretKeys:
licenseKeyKey: LICENSE_KEY

Если имя ключа в Secret отличается — например, pg_password вместо PGPASSWORD — укажите соответствие через secretKeys:

postgresql:
existingSecret: trisigma-splitter-secrets
secretKeys:
passwordKey: pg_password
примечание

Использовать одновременно secrets-values.yaml и existingSecret в одном блоке не получится, способы несовместимы друг с другом.

Helm Install

cd trisigma-splitter

helm upgrade --install trisigma-splitter . \
--namespace trisigma-splitter --create-namespace \
-f values-trisigma.yaml \
-f secrets-values.yaml # уберите, если все секреты через existingSecret

Проверка деплоя

После установки убедитесь, что сервис работает:

curl http://<splitter-host>:8890/_info

Ожидаемый ответ:

{
"ip": "10.x.x.x",
"host": "trisigma-splitter-<pod-id>",
"os": "Linux ...",
"language": "go",
"languageVersion": "go1.25.x"
}

Footnotes

  1. Временные — это ошибки из-за кратковременной недоступности или перегрузки ClickHouse (например, NETWORK_ERROR, SOCKET_TIMEOUT, TIMEOUT_EXCEEDED, NO_ACTIVE_REPLICAS); они проходят сами, поэтому отправка повторяется. Полный список кодов: 95, 96, 159, 202, 203, 209, 210, 236, 242, 254, 265, 279, 285, 297, 364, 384, 439, 519, 568, 574, 667, 745, 749, 762, 999 из списка кодов ошибок ClickHouse.

  2. Соответствует секрету SPLITTER_TOKEN в Configurator.

  3. getFeaturesByTag, exposeManyV2, libGetFeaturesV4, libGetConfigsV4, libGetOverridesV4, libExposeV4.