Найти в Дзене
AZAT.TEAM

Переход на микросервисы: взгляд DevOps

Приветствую вас, коллеги, друзья, товарищи! Я Ильдар Гатауллин, DevOps-инженер в компании Аzat.team. Сегодня поделюсь своими мыслями о «прелестях» микросервисов. Если вы только планируете перейти на них, эта статья для вас. Лет 10 назад я впервые столкнулся с понятием «микросервисы». Это когда приложение разбивается на независимые модули, каждый из которых отвечает за свою задачу. Это позволяет разрабатывать и тестировать их отдельно. Я подумал: «О, это то, что надо». Потому что, бывало, мы бились над огромным монолитом очень долго. Старый SaaS в логистике, поддерживаемый большим количеством специалистов, которые время от времени менялись. Каждый релиз — квест на месяц-два. Одни зависают над распутыванием код-ревью. Другие ждут и негодуют. А потом у нас появились микросервисы. И, казалось бы, все участники, как слаженные слаженные механизмы одного конвейера, работают каждый над своей задачей. Я как DevOps-инженер ликовал. Но первый же переход стал «холодным душем»… Практика показала, ч
Оглавление

Приветствую вас, коллеги, друзья, товарищи! Я Ильдар Гатауллин, DevOps-инженер в компании Аzat.team. Сегодня поделюсь своими мыслями о «прелестях» микросервисов. Если вы только планируете перейти на них, эта статья для вас.

От «Эльдорадо» до «Терра Инкогнита»

Лет 10 назад я впервые столкнулся с понятием «микросервисы». Это когда приложение разбивается на независимые модули, каждый из которых отвечает за свою задачу. Это позволяет разрабатывать и тестировать их отдельно.

Я подумал: «О, это то, что надо». Потому что, бывало, мы бились над огромным монолитом очень долго. Старый SaaS в логистике, поддерживаемый большим количеством специалистов, которые время от времени менялись. Каждый релиз — квест на месяц-два. Одни зависают над распутыванием код-ревью. Другие ждут и негодуют.

А потом у нас появились микросервисы. И, казалось бы, все участники, как слаженные слаженные механизмы одного конвейера, работают каждый над своей задачей. Я как DevOps-инженер ликовал.

Но первый же переход стал «холодным душем»… Практика показала, что переход на микросервисы оказался «усыпан граблями». Появилась масса вопросов: как управлять сотней разных сервисов? Кто виноват, если потеряется какая-нибудь транзакция? Почему сеть оказалась узким местом?

Эти самые «волшебные» микросервисы оказались сложной экосистемой со своими законами. Поэтому сегодня поделюсь нашими ошибками и найденными решениями, чтобы ваш переход прошел гладко. Ну или почти гладко.

Подводные камни перехода на микросервисы

Камень 1: Ад распределения транзакций.

Помню, как мы начали “пилить” монолитную систему по продаже билетов. Изначально алгоритм был предельно простой: запрос к БД → покупка → обновление статуса заказа.

После распила на микросервисы эта операция разделилась на три сервиса: TicketService, PaymentService и OrderService. И на нашу службу поддержки «посыпались» жалобы — деньги у клиентов списывались дважды, но статус их заказа не обновлялся.

В итоге выявили сбой между OrderService и PaymentService. Искать причину оказалось адом. Логи были размазаны по трем разным системам. Мы потратили 5 часов, чтобы сопоставить их вручную.

В итоге нашли пары с одинаковым transaction_id, но разными статусами в разных сервисах и внедрили саги (Saga pattern), разбивая крупные транзакции на мелкие в каждом микросервисе. Если подтверждение не поступало, платеж откатывался.

Камень 2: Мониторинг превратился в головоломку.

Мониторинг микросервисов — это другой уровень боли. Каждый сервис со своими логами, метриками и форматами. Бывало, заказы просто «зависали» еще на уровне оформления. В монолите я бы посмотрел в трейс одного запроса. Здесь пришлось перебирать логи трех сервисов.

В итоге оказалось, сервис RecommendationEngine не справлялся с нагрузкой из-за некорректного запроса к Redis. Без Jaeger и Zipkin мы бы потратили кучу времени.

Мы масштабировали стек мониторинга: ELK — для сбора и поиска логов, Prometheus и Grafana — для метрик, Jaeger — для трассировки. Команды начали корректно прокидывать trace-id. Alertmanager на основе трассировок начал делать осмысленные алерты.

И, да. при переходе важно помнить об отдельной статье расходов для хранения и обработки терабайтов логов и метрик в Elasticsearch и Prometheus.

Камень 3: Сеть – это новые точки отказа.

Если в монолите сетевое взаимодействие периферийное, то в микросервисной архитектуре сеть – это кровеносная система. И любая проблемка может ударить напрямую.

Вот, например, в одном из наших DNS-серверов случился кратковременный сбой (5 минут, не больше). Сервис А не получил ответа от сервиса B и многократно прошел по своему стандартному пути.

Когда DNS-сервер восстановился, все эти retry-запросы от сервиса А обрушились на сервис B. Ну и как следствие сервис B под такой нагрузкой начал выдавать ошибку за ошибкой. Возник самоподдерживающийся каскадный фейл, который положил полкластера. Угадайте, сколько времени ушло на восстановление…

Пришлось внедрять паттерны Resilience:

– Circuit Breaker и Resilience4j — для автоматического разрыва сети, чтобы не долбить упавший сервис.

– Rate Limiting & Bulkheads — для сохранности других ресурсов (потоки, соединения).

– Service Mesh (внедрили Istio) — для управления трафиком + трассировка и поддержание метрик на уровне сети.

-2

Камень 4: Тестирование — интеграционный ад.

Чтобы в микросервисах запустить Е2Е-тестирование, нужно во всех согласованных версиях поднять все зависимые сервисы.

Работали как-то три дня над простой фичей — добавить в корзину новый тип скидки. А всё потому, что изменения коснулись и PricingService, и CartService, и PromoService. И юнит-тесты, и интеграционные тесты для сервисов — зеленые. На постановке задач всё падало.

В итоге выявили несовместимость версий. PricingService (разрабатывалась параллельно другой командой) изменили формат ответа в одном из недокументированных полей, на которое неявно полагался CartService.

Решение: пересмотреть CI/CD и подход к тестированию:

– Контрактное тестирование (Pact) ввели как обязательное.

– При тестировании в проде стали активно использовать релизы Blue-Green деплой и Canary.

– Внедрили стимуляторы и умные заглушки для зависимостей, которые требуются в конкретном тесте.

– Для изоляции фич сложные тестовые среды запустили в Kubernetes.

Камень 5: Культура и команды — фундамент всего.

Это неочевидный, но, пожалуй, самый большой «камень». Потому что можно поставить самый крутой Kubernetes, развернуть Istio, настроить Prometheus+Grafana+Jaeger+ELK, автоматизировать деплой до кнопки... Но если команды не готовы к новой реальности — ничего не заработает. Микросервисы требуют командного сдвига. Это факт.

Живой пример: полетел как-то у нас процесс оформления заказа. Понятно было, что ошибка где-то на стыке OrderService и UserProfileService. Однако команды-разработчики этих сервисов начали игру «Это не мой баг». Препирались они ни много ни мало неделю.

В итоге тимлиды нашли ошибку. Проблема была в размытом контракте API и в отсутствии четкой ответственности. Пришлось четко прописать, что команда, которая разработала сервис, несет ответственность за его работу в проде, за мониторинг, алерты и исправление багов.

Также считаю, что в командной работе важно применять стандартизацию инструментов (языков, где возможно, базовых библиотек). Потому что использование модных фреймворков для каждого сервиса – не всегда хорошая идея.

По моему опыту, 50% успеха перехода – это именно люди и процессы.

Сегодня мы в Azat.team активно внедряем микросервисную архитектуру (MSA) для крупных проектов, часто выступая партнером в трансформации монолитных систем. Наш опыт и отточенные процессы — включая строгие регламенты, слаженные команды и эффективный менеджмент — позволяют проводить такую декомпозицию грамотно и результативно.

Микросервисы – Путь, а не Пункт Назначения

В целом микросервисы - это мощная архитектура, дающая скорость в разработке, независимом масштабировании и отказоустойчивости. Но прежде чем запланировать переход задайте себе вопросы:

– Готовы ваши команды к распределенной разработке?

– Только ли переход решит ваши боли в монолите или есть способ попроще?

– И главное – есть ли у вас ресурсы (время, эксперты, бюджет) на преодоление неизбежных камней преткновения?

Если ответы утвердительные и решились встать на путь микросервисов, то будьте готовы к сложностям, учитесь на своих и чужих ошибках (в том числе моих!).

Мой личный совет: Если ваш монолит не задыхается под собственной тяжестью и эволюционирует адекватно бизнесу – возможно, ему еще жить и жить? Не создавайте сложности там, где они не нужны.