Что такое feature flags и как они делают релизы безопаснее
Основы3 минРедакция Innovialabs
Коротко
Feature flag — это переключатель в коде, который включает или выключает функцию без нового деплоя. Он позволяет выкатывать код заранее, открывать функцию части пользователей и мгновенно её отключать, если что-то пошло не так.
Коротко: что такое feature flag
Feature flag (флаг функции, feature toggle) — условие в коде, которое решает, показывать ли пользователю новую функцию. Значение флага хранится вне кода: в конфиге, базе или специальном сервисе — и меняется без пересборки и деплоя.
if (flags.isEnabled("new-checkout", user)) {
return renderNewCheckout();
}
return renderOldCheckout();
Главная идея — разделить деплой и релиз. Деплой — это доставка кода на сервер. Релиз — момент, когда функция становится доступна пользователям. С флагами это два независимых решения.
Почему это делает релизы безопаснее
- Мгновенный откат. Функция ломается — выключаете флаг, а не откатываете весь деплой.
- Постепенный запуск. Сначала команда, потом небольшая доля пользователей, затем все.
- Меньше долгоживущих веток. Незаконченный код можно сливать в main, спрятав за выключенным флагом (trunk-based development).
- Релиз по бизнес-сигналу. Маркетинг открывает функцию в нужный день, без участия разработчиков.
Типы флагов
| Тип | Зачем | Срок жизни |
|---|---|---|
| Release | Спрятать незаконченную или новую функцию до запуска | Короткий: удалить после полного релиза |
| Experiment | A/B-тест: разным группам — разные варианты | До конца эксперимента |
| Ops / kill switch | Аварийно отключить тяжёлую или рискованную часть системы | Долгий, часто постоянный |
| Permission | Открыть функцию определённым тарифам или клиентам | Долгий |
Разделение важно: release-флаг, забытый на год, — это долг, а kill switch, живущий годами, — норма.
Какие инструменты бывают
- Конфиг или переменные окружения. Самый простой вариант для пары флагов, но смена значения часто требует перезапуска.
- Своя таблица в базе + админка. Гибко, но таргетинг, аудит и проценты раскатки придётся писать самим.
- Open-source решения — например, Unleash, Flagsmith, GrowthBook. Можно развернуть у себя.
- SaaS-сервисы — например, LaunchDarkly. Готовые SDK, таргетинг, аудит, но это внешняя зависимость и подписка.
- Стандарт OpenFeature — единый API для работы с флагами, который позволяет сменить провайдера без переписывания кода.
Выбор зависит от числа флагов, нужен ли таргетинг по пользователям и готовы ли вы поддерживать решение сами.
Как не накопить флаговый долг
Каждый флаг — это ветка if в коде и лишний сценарий для тестов. Без дисциплины их становится сотни.
- Владелец и срок. У каждого флага есть ответственный и ожидаемая дата удаления.
- Понятные имена.
checkout-v2-release, а неflag1илиtest_new. - Удаление — часть задачи. После полного релиза заводите задачу на удаление флага и старой ветки кода.
- Регулярный аудит. Раз в спринт или месяц проверяйте флаги, которые давно на 100% или 0%.
- Безопасное значение по умолчанию. Если сервис флагов недоступен, код должен работать в предсказуемом режиме.
Частые ошибки
- Вкладывать флаги друг в друга — комбинаций становится слишком много для тестирования.
- Проверять флаг только на фронтенде, когда бэкенд-эндпоинт остаётся открытым.
- Использовать флаги вместо нормальной системы прав доступа.
- Не логировать, кто и когда переключил флаг.