Небольшая заметка о микросервисах, о боли с которой сталкиваюсь, чаще всего на собеседованиях. До сих пор, со всех утюгов кричат о микросервисах, новоиспеченные разработчики и ITшники, не разбираясь что это и для чего, всюду лезут с микросервисами, считая их серебряной пулей. Многие аутсорсинговые (и не только) компании ищут кандидатов, которые что-то могут в микросервисах, при этом сами не понимая зачем им это.
Почему микросервисы, чем плох монолит?
Давайте быстренько и кратко разберемся. Но сначала нужно сказать о SPA (Frontend) + API (Backend) — это эволюция модульного монолита, с той лишь разницей, что Frontend вынесен уже за пределы монолита, и у нас отдельно существует Backend и Frontend. Также упомянем SOA — была популярна в 2000х и до сих пор существует во многих компаниях. Особенность SOA — это использование универсальной корпоративной шины (ESB) для связи разных сервисов, при этом у нас всё еще присутствует централизация в виде ESB, ведь если ESB будет плохо, то все сервисы пострадают. Мы же рассмотрим две крайности архитектурных решений — самую примитивную архитектуру в виде монолита и вершину эволюции — микросервисы.
Микросервисы и монолит — это две технологии, применимые в современном мире. Каждая имеет свои недостатки и преимущества и каждая применима в своей области. Монолит лучше подходит для небольших приложений, микросервисы для огромных систем.
Вкратце рассмотрим плюсы и минусы обоих подходов.
Монолит
Минусы монолита:
- Сложность понимания для новых сотрудников и зачастую текущих, ввиду большой кодовой базы и наличия связанностей классов.
- Сложность внесения изменений из-за наличия большой связанности классов внутри кодовой базы. Изменяя один кусок кода вы неизбежно столкнетесь с тем, что нужно изменить код еще в нескольких местах.
- Привязанность к технологическому стеку, т.к. вы не можете очень быстро поменять технологический стек монолита. Например, если он написан на Java, вы не можете просто переписать его на Go или дописать что-то на другом языке программирования.
- Сложность тестирования. Зачастую вы не можете приступить к тестированию, потому что связанный код еще дорабатывает другая команда.
- Ненадежность. Если вдруг произойдет какой-то сбой или утечка памяти в одном из модулей монолита, неизбежно весь монолит упадет.
Плюсы монолита:
- Простота разработки. То есть разобравшись однажды, один разработчик может изменить код во всех слоях монолита: frontend, backend, инфраструктурном слоем.
- Простота развертывания: проще развернуть одно приложение, чем группу микросервисов.
- Меньше требований к компетенциям. Разработчику например не нужно знать как делать реализацию транзакционности (как в случае микросервисов), ему не нужны архитектурные компетенции.
- ACID транзакции. Большое преимущество перед микросервисами, где зачастую у каждого сервиса своя база данных и вероятнее, каждая от разных вендоров.
Микросервисная архитектура (MSA)
Минусы микросервисов:
- Трудозатраты на интеграцию. Для каждого нового сервиса мы должны реализовывать интеграцию, взаимосвязь с другими сервисами и должны трать на это время и ресурсы. Тогда как в монолите, добавляю новый модуль внутри него, зачастую мы пользуется уже реализованной интеграцией.
- Сложность правильной декомпозиции сервиса. Для правильно декомпозиции нужны определенные знания, опыт. Если декомпозиция сделана неверно, то есть риск того, что изменения в одном сервисе будут вызывать необходимость изменений в других сервисах ввиду имеющейся связанности сервисов из-за неправильной декомпозиции. Команды станут зависимыми друг от друга.
- Отсутствие транзакционности. Необходимо реализовывать на уровне кода подобие транзакционности для согласованности данных.
Плюсы микросервисов:
- Легче вносить изменения. Вам нужно изучить один сервис, в который нужно внести изменения, в отличие от монолита, где нужно изучать всю систему.
- Легче тестировать.
- Легче внедрять новые технологии. Можно применять любые языки программирования, любые базы данных для решения конкретных задач. Можно легко переписать код на другой язык.
- Оптимизация ресурсов. Так как система разбита на несколько сервисов, можно тонко настраивать количество ресурсов необходимое для каждого сервиса.
Нет лучшей архитектуры!
Первое о чем нужно знать
Даже монолит со структурой «Big Ball of Mud», это неплохая архитектура для стартапов или идеи, которую вы хотите запрототипировать и показать инвестору. Лучше написать плохой код и использовать какую-нибудь простую архитектуру, чтобы показать инвестору ваш проект, чем … Если вы будете несколько недель разбираться с Kubernetes, Kafka, RabbitMQ и ничего не покажите инвестору, соответственно не получите инвестиции и ваш стартап не начнется.
Когда компания уже существует и размер компании не большой, примерно до 100 разработчиков, мы все еще можем использовать монолит или SPA + API. Все могут
эффективно работать в одной кодовой базе, применяя методологию CI/CD, работая с ветками в git, выполняя Merge Requests, Review и т.п. Разработчиков не очень много и работать в одной кодовой базе выгоднее и дешевле, чем расходиться в микросервисы и получать минусы этой архитектуры (сложность правильной декомпозиции, большие трудозатраты на интеграцию, отсутствие транзакционности).
Микросервисы стоит применить когда у вас очень большой продукт и есть элементарная проблема, когда разработчики в одной кодовой базе мешают друг другу: конфликт мерджей, много пул реквестов. Когда компания и/или продукт растет, так или иначе настанет тот час, когда микросервисов не избежать.
Таким образом, микросервисы и монолит — два подхода, которые хороши в своей области, при определенном уровне зрелости компании и/или продукта.
Если вы можете сохранить свою систему достаточно простой, чтобы избежать необходимости в микросервисах — сделайте это!
Цель внедрения микросервисов (MSA)
Зачастую, если спросить у разработчиков: «Для чего мы внедряем микросервисы?», можно услышать следующие ответы:
- Микро сервисы лучше держат высокую нагрузку.
- Микро сервисы легче масштабировать.
- Можно применять разные языки программирования.
- и тд.
Но это не цель внедрения микросервисной архитектуры! Если мы спросим бизнес, чего он хочет, то его ответы будут совершенно другими.
В компании мы занимаемся разработкой для того, чтобы бизнес компании развивался. Поэтому нам нужно ориентироваться на цели бизнеса. MSA — это всего лишь технология, которая должна нам помогать достигать цели бизнеса.
Что нужно бизнесу?
Бизнес хочет как можно чаще проверять какие-то гипотезы. Потому что, когда мы делаем какой-то продукт, мы не всегда понимаем чего хочет клиент. Мы делаем эксперименты, предлагаем клиенту одну, вторую, третью функции. И в конечном счете оказывается, что только 1 из 3 функций приносит прибыль компании. Чем чаще мы проверяем гипотезы на клиентах, тем быстрее мы нащупываем рынок и понимаем какие функции нам приносят
деньги. Чем чаще конкурентов вы делаете релизы, тем больше вероятность найти первыми прибыльную функцию. Соответственно клиент будет считать ваш продукт более удобным, более функциональным и клиентская база у вас будет больше.
Микросервисы — это один из вариантов, не единственный, который позволяет делать независимые релизы как можно чаще. При этом для крупных проектов, это может стать лучшим решение по быстрому развертыванию релизов в продакшн.