Feature flags и A/B-тесты
↑ 8.4 Frontend System Design · ← Предыдущая
Зачем это на собесе
Безопасные релизы и эксперименты — зона ответственности senior.
Feature flags
Условное включение функциональности без деплоя: код фичи задеплоен, но выключен флагом.
const flags = useFlags() // загружаются при старте, обновляются в фоне<NewCheckout v-if="flags.newCheckout" />
<LegacyCheckout v-else />Типы флагов
| Тип | Срок жизни | Пример |
|---|---|---|
| Release | короткий | скрыть недоделанную фичу |
| Experiment | на время теста | A/B-эксперимент |
| Ops (kill switch) | долгий | быстрое отключение тяжёлой функции |
| Permission | постоянный | доступ по плану или роли |
Возможности
- постепенный выпуск (rollout: 1%, 10%, 50%, 100%);
- таргетинг (пользователь, роль, регион, версия);
- мгновенный откат отключением флага;
- canary-релизы;
- разделение деплоя и релиза.
Сервисы и инструменты: LaunchDarkly, Unleash, Flagsmith, GrowthBook, собственная реализация.
Реализация на клиенте
- получение флагов при старте (SSR — на сервере, чтобы не мигало);
- стабильное распределение: хэш от
userIdи ключа флага, чтобы пользователь всегда видел один вариант; - значения по умолчанию, если сервис недоступен;
- не хранить секреты во флагах (они публичны);
- типизация ключей.
const bucket = (userId: string, key: string) => hash(`${key}:${userId}`) % 100
const enabled = bucket(user.id, 'new-checkout') < rolloutPercentA/B-тесты
- Гипотеза и метрика успеха (конверсия, время задачи).
- Случайное разделение на группы (control, variant), размер выборки и длительность (статистическая значимость).
- Единая привязка пользователя к варианту.
- Сбор событий (экспозиция и целевые действия).
- Анализ: доверительные интервалы, побочные метрики (guardrails).
- Решение, удаление проигравшего варианта и флага.
Ловушки: подглядывание (остановка при первом «значимом» результате), взаимовлияние экспериментов, разный кэш CDN, мигание вариантов (flicker), смещённая выборка.
Технический долг
Флаги надо удалять: владелец и срок, регулярная чистка, покрытие тестами обоих вариантов, линтер устаревших флагов.
Вопросы с ответами
Чем деплой отличается от релиза?
Деплой — код попал на прод. Релиз — фича доступна пользователям. Feature flags разделяют эти моменты.
Как обеспечить, чтобы пользователь всегда видел один вариант эксперимента?
Детерминированное распределение по хэшу от идентификатора пользователя и ключа эксперимента, либо сохранение назначения на сервере.