Перейти к основному содержимому
Версия: Релиз 11.06.2026

Splitter

Версии в этом релизе
Чартregistry.trisigma.io/trisigma/charts/trisigma-splitter:0.2.0
Образregistry.trisigma.io/trisigma/images/trisigma-splitter:0.1.0

Назначение​

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. ↩