Короткий ответ
Единого архитектурного решения нет — на масштабе важно спроектировать низколатентную оценку флагов без похода в сеть на каждый запрос (локальный кэш конфигурации флагов с периодическим обновлением или push-обновлениями), чёткое разделение типов флагов (kill switch, release, experiment, permission) с разным жизненным циклом и владением, встроенный аудит изменений флагов, и явную политику остановки — технический kill switch, который должен работать даже при недоступности самой flag-платформы (fail open/fail closed в зависимости от флага).
Как это работает подробнее
при высокой нагрузке поход в внешний сервис флагов на каждый запрос создаёт неприемлемую задержку и единую точку отказа; поэтому зрелые flag-платформы (LaunchDarkly, собственные решения) используют SDK с локальным in-memory кэшем конфигурации, который периодически обновляется или получает push-обновления через streaming-соединение, и могут продолжать работать по последней известной конфигурации при временной недоступности центрального сервиса.
Пример кода
Вопрос для обсуждения: у сервиса 50 000 RPS, SDK кэширует конфигурацию
флагов с обновлением раз в 30 секунд через streaming-соединение к
flag-серверу. Во время инцидента нужно мгновенно выключить проблемную
функциональность для всех пользователей.
Как спроектировать "аварийный" kill switch, который применяется быстрее,
чем обычный цикл обновления конфигурации в 30 секунд, не жертвуя
отказоустойчивостью обычных флагов?Сравнение
- Компромисс. локальное кэширование конфигурации флагов снижает задержку и повышает отказоустойчивость, но вносит задержку в распространение изменений (eventual consistency — не все инстансы сразу увидят новое значение флага) и требует механизма принудительной инвалидации для действительно срочных kill switch; полностью централизованная синхронная оценка даёт мгновенную консистентность, но ценой задержки и надёжности. Выбор зависит от того, насколько критична мгновенность применения флага против толерантности к секундам задержки распространения.
Что использовать на практике
- На практике. критично явно определить для каждого флага поведение при сбое оценки — должен ли сервис «упасть безопасно» в выключенное состояние (fail closed, для рискованных фич) или сохранить последнее известное состояние/включённое по умолчанию (fail open, для некритичных UI-экспериментов). Нужен также аудит — кто, когда и почему изменил значение флага, особенно для flags, которые могут влиять на деньги или безопасность, и мониторинг производительности самой системы оценки флагов, которая теперь находится в hot path каждого запроса.
- Пример. Ожидаемый ответ: обсуждение отдельного быстрого push-канала (webhook/SSE) именно для kill switch флагов в дополнение к обычному циклу обновления, либо явного разделения архитектуры на "обычные" флаги с relaxed consistency и критичные kill switch с приоритетной доставкой.
Подводные камни
- Частые ошибки. делают оценку флага синхронным сетевым вызовом на каждый запрос без локального кэша, создавая узкое место и единую точку отказа на критичном пути; не разделяют типы флагов по владению и сроку жизни, из-за чего платформа обрастает сотнями флагов без понятной ответственности за каждый.