Skip to content

Таргетинг

Таргетинг определяет, какие пользователи увидят фичу. можно. использует контекстные правила (constraints), сегменты и процентный роллаут для точного управления аудиторией.

Как работает таргетинг

При оценке флага SDK последовательно проверяет:

  1. Флаг включён? — если флаг (или стратегия) выключен, вернуть false
  2. Контекстные правила — все заданные правила должны совпасть (логическое И)
  3. Сегменты — хотя бы один сегмент должен совпасть (логическое ИЛИ)
  4. Если заданы и правила, и сегменты — достаточно совпадения любого из них (ИЛИ)
  5. Процентный роллаут — детерминированное распределение через MurmurHash32
  6. По умолчанию — если ничего не задано, вернуть false
graph TD
    CTX[Контекст запроса] --> EN{Флаг включён?}
    EN -->|Нет| FALSE[false]
    EN -->|Да| HAS_RULES{Есть контекстные<br/>правила?}
    HAS_RULES -->|Да| EVAL_RULES[Проверка всех правил<br/>AND-логика]
    HAS_RULES -->|Нет| HAS_SEG{Есть сегменты?}
    EVAL_RULES --> RULES_OK{Все правила<br/>совпали?}
    RULES_OK -->|Нет| HAS_SEG
    RULES_OK -->|Да| PCT[Процентный роллаут]
    HAS_SEG -->|Да| EVAL_SEG[Проверка сегментов<br/>OR-логика]
    HAS_SEG -->|Нет| PCT
    EVAL_SEG --> SEG_OK{Хотя бы один<br/>сегмент совпал?}
    SEG_OK -->|Нет| HAS_RULES
    SEG_OK -->|Да| PCT
    PCT --> TRUE[true]

Контекстные правила (Constraints)

Каждое правило — это сравнение поля контекста со значением через оператор. Все правила внутри стратегии объединяются логическим И.

json
{
  "field": "country",
  "operator": "in",
  "values": ["RU", "BY", "KZ"]
}

Операторы

ОператорОписаниеПример
inЗначение входит в списокcountry in ["RU", "BY"]
not_inЗначение НЕ входит в списокcountry not_in ["US", "CA"]
eqРавенствоplan eq "premium"
neНеравенствоplan ne "free"
gtБольшеappVersion gt "2.0.0"
gteБольше или равноage gte "18"
ltМеньшеpriority lt "5"
lteМеньше или равноretries lte "3"
containsСодержит подстрокуemail contains "@company.com"

Типы контекста

Тип (contextType) определяет, как сравниваются значения:

ТипСравнениеПример
string (по умолчанию)Строковоеcountry in ["RU"]
numberЧисловое (double)age gte "18"
timeISO8601 дата/времяeventDate gt "2026-01-01T00:00:00Z"
semverСемантическое версионированиеappVersion gte "2.1.0"

Семантическое версионирование корректно: "2.10.0" > "2.9.0".

Пример: комбинирование правил

Стратегия для флага ai-search:

json
{
  "contextValuesJson": "[{\"cd\":1,\"op\":\"in\",\"val\":\"RU\"},{\"cd\":2,\"op\":\"eq\",\"val\":\"premium\"}]"
}

Пользователь должен быть из России И с тарифом Premium (AND-логика).

Сегменты

Сегмент — переиспользуемая группа пользователей со своим набором контекстных правил. Внутри сегмента все правила — AND-логика. Стратегия может ссылаться на несколько сегментов — достаточно совпадения любого из них (OR-логика).

Преимущества сегментов

ПреимуществоОписание
Единая точка правдыИзменили сегмент — все флаги автоматически обновились
DRYНе повторяете одни и те же правила на каждом флаге
АудитВидно, кто и когда изменил состав сегмента

Процентный роллаут

Детерминированное распределение через хеширование:

hash = MurmurHash32(flagKey + userId) % 100
if hash < percentage → enabled

Один и тот же пользователь всегда получает одинаковый результат для одного флага. Если userId отсутствует, используется sessionId.

Совмещение правил и сегментов

Когда в стратегии заданы и контекстные правила, и сегменты:

  • Если пользователь удовлетворяет правилам ИЛИ попадает в любой из сегментов → флаг включён
  • Если не подходит ни под правила, ни под сегменты → применяется процентный роллаут
  • Если процентный роллаут тоже не задан → флаг возвращает false

Что дальше?

  • Роллаут — процентная раскатка и стратегии
  • Сегменты — переиспользуемые группы пользователей
  • Флаги — типы флагов и жизненный цикл
  • SDK: Обзор — как SDK оценивает правила локально

Released under the AGPL v3.0 License.