Ладно, последний шаг, чтобы все взлетело и наше приложение было готово к реальным пользователям. Вот ты хочешь выкатить свой сервис в прод. Но как же его выкатывать? Какие стратегии существуют?
Есть разные подходы к деплойменту (выкатке) микросервисов. Каждая стратегия имеет свою специфику и подходит под определённые задачи. Сейчас мы разберем только Rolling Release, так как это самый используемый вариант. Например, Kubernetes используют по дефолту эту стратегию.
Rolling Release
Суть стратегии: обновляешь сервис постепенно, меняя код на новых экземплярах (pods/контейнерах), пока все старые не будут заменены на новые.
Как это выглядит (на примере Kubernetes):
В каждый момент времени часть podов обновляется, часть — еще на старой версии.
Когда использовать Rolling Release:
- если считаешь, что новая версия вполне стабильна и критичных рисков нет, можно использовать. Если же риски есть, лучше посмотреть на другие варианты — например, Blue/Green deployment;
- можешь обеспечить непрерывную доступность (downtime минимальный);
- готов мириться с тем, что часть трафика может идти на старую версию, часть — на новую, пока процесс обновления не завершится. В общем-то, это приемлемо для большинства ситуаций.
Плюсы:
- Почти нулевой простой (downtime).
- Постепенное обновление (можно отследить, если вдруг пойдёт что-то не так).
Минусы:
- Более длительный процесс деплоя, чем «одним махом».
- Если потребуется срочно откатиться, придётся заново менять версию на всех pod’ах.
Давай посмотрим на практике. Представь, что мы обновляем сервис реакций в мессенджере. С помощью Rolling Update мы заменяем старые версии на новые постепенно, скажем, по 5% за раз.
Если в новой версии окажется критический баг (например, сервис падает при определённых эмодзи), мы увидим всплеск ошибок уже на первых 5-10% «обновлённых» пользователей. Это позволит нам сразу остановить выкатку, пока проблема не затронула всех.
Без постепенности баг ударил бы по 100% пользователей одновременно, а это привело бы к массовым жалобам и срочному откату всего сервиса под нагрузкой.