Мы пилим монолит на микросервисы!
Кажется, это одна из тех задач, которую в современном мире делает чуть ли не каждая IT-компания.
Зачем? Стандартные ответы следующие:
- Накопилось легаси, и нам посоветовали переписать.
- Сервис нестабильно работает, решили, что микросервисы надежнее.
- Хотим ускорить сервис, ведь микросервисы быстрее.
- Разработчики хотят новый стек, а с микросервисами проще внедрять другие языки.
- Инфраструктура будет дешевле, ведь масштабировать можно по-отдельности.
В целом ключевая ценность микросервисов - это ускорение разработки. А это один из важнейших факторов для руководителей разработки и IT-компаний. Обычно от разделения монолита на независимые сервисы, мы избавляемся от ситуаций, когда одна команда ждет другую, потому что в коде обнаружились баги и получаем возможность быстро вносить изменения в прод без зависимости от других команд.
Это особенно важно для крупных команд - в монолите, с ростом числа разработчиков, скорость работы падает. А микросервисы помогают сохранить темп.
Если все сделать правильно, можно получить и другие плюсы:
- Масштабируемость - можно отдельно увеличивать нужные компоненты.
- Отказоустойчивость - сбой одного сервиса не положит весь продукт.
- Мультистек - каждая команда может выбирать технологии, подходящие под ее задачу.
- Переиспользование - модули можно использовать в разных частях продукта.
Но есть нюанс.
Распил монолита - это не спринт, а полноценный марафон. Чаще всего это задача длиной в несколько лет, где нет мгновенного результата. И тут начинается самое интересное - жопы бизнеса горят 🔥. Потому что вместо “быстрее выводить фичи”, ресурсы тратятся на непонятные рефакторинги, переписывание кода, переносы данных и всякие другие инженерные задачи.
В глазах бизнеса это выглядит как:
- Мы тратим кучу денег, а где результат?
- Почему я не вижу новых фич?
- Зачем все так усложнять, если раньше и так работало?
Второй нюанс - поддержка микросервисов стоит дороже:
- Оркестрация (Kubernetes и вся его магия).
- Нюансы с консистентностью данных.
- Сетевые задержки между сервисами.
- Сложности с end-to-end тестированием.
Эти сложности окупаются только на больших масштабах, где критично поддерживать высокую скорость изменений и параллельную работу множества команд.
Но главное - не вестись на тренды, если нет реальной необходимости. Иногда хороший монолит, который стабильно работает и быстро развивается, лучше, чем дорогой и сложный зоопарк из микросервисов.
PS: Да и мы в компании сейчас как раз дораспиливаем монолит. 😎
PS2: Есть замечательный ресур
с microservices.io, где собраны ценные материалы по этой теме.