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 |
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
| Секрет | Ключ | Описание |
|---|---|---|
PGPASSWORD | postgresql.password | Пароль для подключения к PostgreSQL |
ClickHouse
| Секрет | Ключ | Описание |
|---|---|---|
CLICKHOUSE_PASSWORD | clickhouse.password | Пароль для подключения к ClickHouse |
Межсервисная авторизация
| Секрет | Ключ | Описание |
|---|---|---|
CONFIGURATION_TOKEN | interServiceAuth.configurationToken | Токен для авторизации запросов от Configurator2 |
Публичный API
| Секрет | Ключ | Описание |
|---|---|---|
USER_TOKEN | publicApi.userToken | Токен для авторизации запросов для публичных эндпоинтов3 |
ROTATABLE_USER_TOKEN | publicApi.rotatableUserToken | Опциональный. Второй слот для бесшовной ротации USER_TOKEN |
- Задайте новый токен как
ROTATABLE_USER_TOKEN - Обновите клиентов на новый токен
- Перенесите его в
USER_TOKENи очиститеROTATABLE_USER_TOKEN
Лицензия
| Секрет | Ключ | Описание |
|---|---|---|
LICENSE_KEY | license.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"
}