Роллаут
Роллаут — процесс постепенного включения фичи для всё большего числа пользователей. можно. использует процентный роллаут с детерминированным распределением на основе MurmurHash32.
Как работает процентный роллаут
Процентный роллаут — это поле percentage (0–100) в настройках стратегии флага. При оценке флага SDK вычисляет:
hash = MurmurHash32(flagKey + идентификатор) % 100
if hash < percentage → enabledMurmurHash32 гарантирует детерминированность: один и тот же пользователь всегда получает одинаковый результат для одного флага при неизменном проценте. Пользователь не «прыгает» между включённым и выключенным состоянием.
В качестве идентификатора используется userId, затем sessionId. Если не передан ни один, SDK автоматически генерирует стабильный анонимный идентификатор (anonymousId): в браузерных SDK он сохраняется в localStorage и переживает перезагрузку страницы, в серверных — создаётся при старте клиента и живёт до перезапуска приложения.
Благодаря этому анонимный трафик распределяется по корзинам равномерно и стабильно: каждый анонимный пользователь/инстанс всегда попадает в одну и ту же группу, а проценты роллаута честно применяются ко всей аудитории. Поведение управляется опцией stickyAnonId (по умолчанию true) во всех SDK. Если её отключить, все анонимные запросы без идентификатора попадают в одну группу — SDK выводит предупреждение в лог.
При обновлении: в версиях SDK до появления
stickyAnonIdвсе анонимные запросы без идентификатора попадали в одну корзину (по ключу флага). После обновления анонимный трафик перейдёт в новые корзины — в браузере привязанные к ID из localStorage, на сервере — к ID инстанса приложения — поэтому эффективный процент роллаута для анонимной аудитории может измениться скачком. Планируйте обновление при проценте 100%/0% либо временно отключитеstickyAnonId, чтобы сохранить прежнее поведение.
При 100% фича включена для всех; при 0% — выключена.
graph LR
Eval[Оценка флага] --> Hash[MurmurHash32<br/>flagKey + идентификатор]
Hash --> Bucket{hash % 100<br/>< percentage?}
Bucket -->|Да| True[true]
Bucket -->|Нет| False[false]
Пример стратегии раскатки
Один из возможных сценариев — адаптируйте процент и длительность под свой проект:
graph LR
S0["0%<br/>Выключено"] -->|Проверка| S1["1%<br/>Канареечный"]
S1 -->|Мониторинг 30 мин| S2["5%<br/>Расширенный"]
S2 -->|Мониторинг 2 часа| S3["25%<br/>Четверть"]
S3 -->|Мониторинг 1 день| S4["50%<br/>Половина"]
S4 -->|Мониторинг 1 день| S5["100%<br/>Все"]
| Этап | Процент | Длительность | Что проверять |
|---|---|---|---|
| Подготовка | 0% | Перед запуском | Флаг создан, стратегия настроена, код задеплоен |
| Канареечный | 1% | 30 минут | Ошибки, latency, расход памяти. Если аномалии — откат |
| Расширенный | 5% | 2 часа | Стабильность метрик, бизнес-показатели |
| Четверть | 25% | 1 день | Поведение на разнообразной аудитории |
| Половина | 50% | 1 день | Сравнение метрик со старым вариантом |
| Все | 100% | — | Фича полностью включена |
Совет: Не пропускайте этапы. Даже «безопасная» фича может вызвать непредвиденный рост нагрузки. Канареечный деплой на 1% выявляет проблемы с минимальными последствиями.
Канареечный релиз
Канареечный релиз направляет небольшой процент трафика на новую версию через фиче-флаг:
graph LR
LB[Балансировщик] --> Old[Сервис v1<br/>стабильный]
LB --> New[Сервис v2<br/>канареечный]
New --> Flag[Флаг Можно.:<br/>canary_checkout]
Flag -->|5%| NewHandler[Новый обработчик]
Flag -->|95%| OldHandler[Старый обработчик]
- Создайте RELEASE-флаг, по умолчанию выключен
- Задеплойте обе версии сервиса — v1 и v2
- Код v2 проверяет
client.isEnabled("flag", context)перед выполнением новой логики - В панели настройте стратегию с процентным роллаутом 5%
- Мониторьте ошибки, latency и бизнес-метрики для канареечной группы
- Постепенно увеличивайте процент или откатывайте до 0% при проблемах
Роллаут и таргетинг
Процентный роллаут работает поверх контекстных условий и сегментов: пользователь сначала должен пройти правила таргетинга, и только потом применяется процент. Подробнее — Как сочетаются условия и сегменты.
Откат
Мгновенный откат
Установите процент в 0 или отключите стратегию (enabled: false) — фича мгновенно выключится для всех.
Kill Switch
Для экстренных ситуаций используйте флаг типа KILLSWITCH: когда его выключают в панели, isEnabled() возвращает false для всех — функциональность мгновенно блокируется.
if (!client.isEnabled("payment-gateway-killswitch")) {
throw new ServiceUnavailableException();
}Пример настройки по окружениям
Один из возможных подходов — независимый роллаут на каждом окружении:
| Окружение | Процент | Правила |
|---|---|---|
| dev | 100% | Без ограничений |
| staging | 100% | Сегмент тестировщиков |
| production | 1% → 100% | Поэтапная раскатка |
Это позволяет свободно тестировать на dev и staging, одновременно проводя осторожный роллаут на production.
Что дальше?
- Таргетинг — контекстные условия и сегменты
- Работа с флагами — жизненный цикл флага
- Аудит — отслеживание всех изменений роллаута