Когда нужно точно контролировать, кто первым получит новую версию
Представьте: у вас приложение работает в трех регионах — Азия, Европа и Америка. Вы только что завершили крупное обновление, но не уверены, как оно поведет себя в разных инфраструктурных условиях или при разных сценариях использования. Можно выкатить всё сразу и надеяться на лучшее. Или сделать canary-развертывание и направить 5% случайного трафика на новую версию.
Но что, если проблема не случайна? Что, если у пользователей в Азии другая сетевая конфигурация, или премиум-пользователи проходят платежные сценарии, которые бесплатные никогда не трогают? Случайные 5% могут не захватить именно ту группу, где произойдет сбой.
Вот когда вам нужно больше контроля, чем дает canary. Нужно решать не только сколько трафика получит новую версию, но и кто его получит.
Что на самом деле означает staged rollout
Staged rollout (поэтапное развертывание) — это стратегия, при которой новая версия выпускается для определенных групп пользователей в запланированной последовательности. Каждая группа определяется критериями, важными для вашего приложения: географический регион, тип аккаунта, платформа устройства, диапазоны ID пользователей или любой другой атрибут, по которому можно маршрутизировать.
Основная идея проста: ограничить риск, контролируя, какие пользователи получают новую версию на каждом этапе. Вы наблюдаете за каждой группой, прежде чем перейти к следующей. Если что-то идет не так, радиус поражения ограничен известным и управляемым набором пользователей.
Это отличается от canary-развертывания. Canary использует случайные проценты трафика. Ему все равно, кто пользователь. Staged rollout глубоко заботится о том, кто что получает, потому что группировка осознанна и основана на бизнес- или операционной логике.
Конкретный пример: развертывание по регионам
Вернемся к сценарию с тремя регионами. Ваше приложение работает в Азии, Европе и Америке. Вы подозреваете, что сетевая задержка, конфигурации дата-центров или локальные требования соответствия могут вызвать проблемы в одном регионе, но не в других.
Следующая блок-схема иллюстрирует процесс поэтапного развертывания для примера с тремя регионами:
При поэтапном развертывании вы сначала выпускаете обновление в Азии. Ваша команда следит за частотой ошибок, временем отклика и сообщениями пользователей в течение нескольких часов или дня. Если всё стабильно, вы выпускаете обновление в Европе. После очередного периода наблюдения — в Америке.
Каждый этап дает контрольную точку. Если в Азии наблюдается всплеск ошибок подключения к базе данных, вы останавливаете развертывание, исправляете проблему и начинаете заново. Два других региона никогда не видели сломанную версию.
Этот шаблон распространен в компаниях, обслуживающих глобальную аудиторию. Он также используется внутри компании перед публичным релизом: сначала новую версию получают внутренние пользователи, затем небольшая группа внешних ранних последователей, потом конкретный регион, и наконец — все.
Другой пример: сегментация по типу аккаунта
Рассмотрим финтех-приложение с бесплатными и премиум-пользователями. Новый релиз включает серьезные изменения в модуле обработки платежей. Если что-то пойдет не так, премиум-пользователи не смогут завершить транзакции, что приведет к потере дохода и недовольству клиентов.
Бесплатные пользователи не используют платежную функцию. Они — более безопасная первая группа. Вы выпускаете обновление сначала для бесплатных пользователей, наблюдаете за любыми побочными эффектами в других частях приложения и только затем выпускаете для премиум-пользователей.
Этот подход работает, потому что группировка основана на использовании функций, а не только на географии. Вы сознательно выбираете группу с более низким риском для первоначальной экспозиции.
Ring Deployment: распространенный шаблон
Поэтапное развертывание часто реализуется как ring deployment (кольцевое развертывание). Представьте концентрические кольца, расширяющиеся наружу:
- Ring 0: Внутренняя команда и QA
- Ring 1: Ранние последователи или бета-пользователи
- Ring 2: Пользователи в определенном регионе или с определенным типом аккаунта
- Ring 3: Все пользователи
У каждого кольца свои критерии, окно наблюдения и план отката. Внутренние кольца меньше и безопаснее. Внешние — больше и несут больше риска. Вы двигаетесь наружу только когда внутренние кольца не показывают критических проблем.
Этот шаблон дает четкий, повторяемый процесс для каждого релиза. Вы точно знаете, какая группа получает новую версию первой, как долго наблюдать и какие метрики сигнализируют об остановке или откате.
Чем staged rollout отличается от canary
Ключевое различие — намеренность. Canary говорит: «Отправь 5% трафика на новую версию случайным образом». Staged rollout говорит: «Отправь сначала весь трафик из Азии на новую версию, затем из Европы, затем из Америки».
Canary — статистический. Он предполагает, что случайная выборка представляет всю базу пользователей. Staged rollout — категориальный. Он предполагает, что разные группы пользователей имеют разные профили риска, и вы хотите контролировать порядок экспозиции.
Оба снижают риск, но решают разные проблемы. Canary хорош для раннего выявления общих проблем. Staged rollout хорош для выявления проблем, специфичных для группы, до того, как они распространятся.
Требования к инфраструктуре
Staged rollout не бесплатен. Вам нужна инфраструктура, которая может маршрутизировать пользователей на основе атрибутов, а не только процентов трафика. Обычно это означает:
- Балансировщик нагрузки или service mesh, поддерживающий маршрутизацию по заголовкам или cookie
- Логика приложения, способная читать контекст пользователя и направлять запросы к правильной версии
- Feature flags или слоты развертывания, сопоставленные с конкретными группами пользователей
- Инструменты observability, которые могут разрезать метрики по группам, а не только глобально
Без observability по группам staged rollout слеп. Вам нужно сравнивать частоту ошибок, задержку и бизнес-метрики между группой, получившей новую версию, и группой, которая ее не получила. Глобальный график ошибок не скажет вам, что в Азии сбой, а в Европе всё в порядке.
Когда не стоит использовать staged rollout
Staged rollout добавляет сложность. Если ваше изменение невелико, риск низок, а база пользователей однородна, достаточно rolling update или простого canary. Не усложняйте стратегию развертывания для исправления опечатки или небольшого изменения интерфейса.
Кроме того, staged rollout плохо работает, если вы не можете надежно идентифицировать группы пользователей на уровне маршрутизации. Если в вашем приложении нет учетных записей пользователей или весь трафик проходит через единую точку входа без контекста, у вас может не быть данных для определения осмысленных групп.
Краткий практический чек-лист
Если вы решили внедрить staged rollout, вот что нужно сделать правильно:
- Определите группы на основе риска, а не удобства. Первая группа должна быть самой безопасной, а не самой простой для маршрутизации.
- Установите окна наблюдения с четкими критериями успеха. Не переходите к следующему этапу, пока не накопите достаточно данных.
- Имейте план отката для каждого этапа. Если Азия вышла из строя, можете ли вы откатить только Азию, не затронув другие регионы?
- Обеспечьте observability по группам. Ваши дашборды должны показывать метрики, разбитые по группам.
- Сообщите план развертывания команде. Все должны знать, какая группа активна и когда начнется следующий этап.
Вывод
Staged rollout дает вам контроль над тем, кто первым получает новую версию. Это не замена canary-развертыванию. Это другой инструмент для другой ситуации: когда вы знаете, что ваши пользователи неодинаковы, и хотите защитить наиболее ценные или уязвимые группы, выставляя их последними.
В следующий раз, планируя рискованный релиз, спросите себя: «Если этот релиз провалится, какую группу пользователей сломать в первую очередь будет наименее болезненно?» Эта группа и есть ваш первый этап.