Привет, Хабр! Меня зовут Кирилл Рождественский, работаю тим-лидом в компании TCP-Soft, но поскольку инициатива написать настоящий материал была совместной с коллегами из Mango Office, они предоставили мне аккаунт для публикации в их блоге.

В серии из трех статей я расскажу о миграции с монолитной на микросервисную архитектуру. Разберемся, когда и кому это действительно нужно, рассмотрим 7 паттернов этого процесса и его самый больной вопрос: «Как быть с данными?». В первой части, то есть под катом, вспомним ключевые определения и выясним, когда микросервисы использовать стоит, а когда нет. Она ориентирована на людей, не слишком хорошо знакомых с микросервисами, более опытным специалистам рекомендуем эту часть пропустить.

Итак, что такое монолит и микросервис?

Монолит — это одно приложение, которое инкапсулирует в себе всю бизнес-логику. Монолит может одновременно заниматься и обработкой контактных данных, и менеджментом платежных транзакций. Часто одним из характерных признаков монолита является прямая работа с базой данных.

В противовес монолиту микросервисная архитектура подразумевает разделение по множеству признаков: бизнес-логике, владению данными, зонам ответственности и т.д.

Важно отметить, что простое разбиение монолита на несколько процессов не делает автоматически архитектуру микросервисной. Если несколько процессов продолжают работать с общей базой, или же падение одного из процессов ведет к неработоспособности другого — это не микросервис, а распределенный монолит.

5 характерных признаков микросервиса

1.Ориентированность на бизнес-домен

Что такое «бизнес-домен»? Как следует из названия, это понятие, которое хорошо знакомо бизнесу и которым он может оперировать. Бизнес привык использовать некие абстрактные сущности, понятные конечному заказчику. Клиент никогда не будет требовать «реализовать подключение к БД через DBA на Java». Зато вполне может попросить поддержку разделения контактов адресной книги на группы в разрезе организации. Мы являемся разработчиками сервисов для виртуальной телефонии, и в нашем случае примерами бизнес-сущностей являются «Адресная книга», «Перечень сотрудников», «СМС-рассылки» и т.д.

2. Независимость в плане владения кодом

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

3. Независимость с точки зрения технологий

Мы можем экспериментировать и выбирать наиболее подходящие под каждую конкретную задачу стеки. Если критична производительность, уходим в C++. Необходимо быстро разворачивать rest-endpoint’ы, используем, например, Node.js. Так, у нас большинство микросервисов написаны на Node.js с использованием чистого JavaScript. Однако для критических сервисов (такими являются, например, точки подключения клиентских приложений) мы используем уже TypeScript, что значительно снижает количество ошибок, попадающих на бой, и ускоряет отладку.

4. Независимость по данным

В идеале у каждого микросервиса должна быть своя, абсолютно независимая база данных. Это даст сразу несколько существенных преимуществ:

  • Так как данными обладает только один микросервис, мы можем как угодно менять схему хранения, не рискуя сломать функционал, за который не отвечаем.

  • Мы можем не бояться, что кто-то нечаянно повредит наши данные.

  • Мы можем применять наиболее подходящие технологии для конкретных задач, например, ClickHouse для OLAP-решений, Elasticsearch для индексации, MongoDB для хранения содержимого веб-страниц.

5. Независимость развертывания

То, за что многие любят, ценят и пытаются внедрить микросервисы. Неправильно, если KPI-сервер не может деплоиться без перезапуска адресной книги. Ровно как и кажется странным ждать общего релиза всей инфраструктуры только для того, чтобы поменять формат отчета.

5 случаев, когда стоит задуматься о переходе на микросервисы

1. Необходимо повысить автономность групп

Любой монолит рано или поздно разрастается до больших размеров, а вместе с ним — команда. Когда мы имеем набор микросервисов, можем выделить узких специалистов на разные функции. Благодаря этому все вокруг понимают, куда идти, если сломается что-то определенное.

Отметим, что микросервисная архитектура связана с Agile. С чем сталкивались мы при миграции на гибкую методику разработки: люди делятся на команды лишь организационно, а работать при этом вынуждены с одной кодовой базой. Переход на микросервисы позволяет делиться на команды логически и каждой из них заниматься только одной конкретной задачей в своем направлении.

2. Необходимо сократить время доставки

Здесь логика связана с одной из характеристик микросервисов — независимостью развертывания. Чем более узкий функционал зашит в микросервис, чем больше он обособлен и чем меньше зависит от сторонних компонентов, тем проще его задеплоить.

3. Необходимо повысить отказоустойчивость

Зачастую проще отслеживать производительность и ошибки отдельных микросервисов, чем всего монолита. К тому же, в правильно реализованной микросервисной архитектуре отказ одного компонента не влияет на жизнь остальных. Например, если упадет микросервис, отвечающий за работу с сотрудниками, коммутатор должен продолжать работу, и звонки будут проходить.

4. Необходимо увеличить гибкость при масштабировании

Зачастую монолит можно масштабировать только вертикально. Однако любые ресурсы, будь то CPU или оперативная память, конечны. Микросервисы же в подавляющем большинстве легче спроектировать, исходя из горизонтального масштабирования.

Также немаловажную роль имеет локальность масштабирования. Если, например, у нас медленно выполняются запросы к адресной книге, мы можем увеличить мощности только одного микросервиса, а не всей инфраструктуры. Это удобнее и, что порой очень важно для бизнеса, намного дешевле.

5. Хочется опробовать новую технологию

Например, хотим «пощупать» новый фреймворк, который в 10 раз быстрее работает со строковыми данными. В монолите функционал новой технологии может занимать очень маленькую долю от общего. Пересобирать весь монолит ради эксперимента, который гипотетически даст перфоманс в 3% кода, невыгодно бизнесу и неоправданно для команды. С маленькими микросервисами пробовать новое проще и удобнее.

4 случая, когда на микросервисы переходить не стоит

Лет 5-7, а то и 10, назад на микросервисы пытались перейти все (примерно как сегодня на Scrum), лишь потому что это модно. Сегодня же очевидно: чтобы из одного большого проблемного монолита не получилось много проблемных микросервисов, не надо стараться перейти на микросервисы, если:

1. У вас и сейчас все работает

Если у вас приложение на стадии глубокой поддержки и сейчас развивается довольно неактивно или активно, но по уже проторенным дорожкам, и какого-то принципиально нового функционала не появляется, то объективных причин для перехода на микросервисы нет.

2. У вас стартап

Разработку проекта не стоит начинать с микросервисной архитектуры, так как она весьма сложна, требует дополнительных расходов и никак не способствуют быстрому выходу на рынок.

3. Нет ярко выраженной доменной модели

Если в монолите нет четко выраженной доменной модели, либо все связано со всем, и когда вынимается один кирпичик, вся башня разваливается, опять-таки лучше не торопиться. Начать лучше с рефакторинга существующего кода. И когда монолит будет «причесан», из него можно по частям выносить функционал в микросервисы.

4. Вы предоставляете коробочное решение

Если вы предоставляете коробочное решение, которое должно развертываться на стороне клиента, хорошим вариантом будет его реализация в виде монолита. Клиент скорее всего не захочет деплоить у себя монструозную инфраструктуру и нанимать штат DevOps-инженеров, чтобы это поддерживать. Клиент хочет скачать один пакет, установить его на свой сервер, и чтобы все заработало.

На этом закончим первую из нашей серии статей о переходе с монолита на микросервисы. Делитесь своими мыслями по теме и задавайте вопросы  в комментариях.

В следующей части разберем 7 миграционных паттернов: «удавка», «композиция UI», «разделение по абстракции», «шпион», «параллельное выполнение», «канареечный релиз», «декоратор».


Подписывайтесь на наши соцсети:

Аккаунты Mango Office

Аккаунты TCP-Soft

* Продукт компании Meta, признанной в РФ экстремистской организацией

Комментарии (5)


  1. Fafhrd
    26.09.2022 15:40

    или же падение одного из процессов ведет к неработоспособности другого — это не микросервис, а распределенный монолит

    Если микросервис авторизации упадёт, что будет? А если это микросервис аутентификации?


    1. LabEG
      26.09.2022 16:31

      Клиент сможет пользоваться всем, кроме авторизованной зоны.


  1. Ares_ekb
    27.09.2022 06:23
    +2

    «Как быть с данными?»

    Я всё-таки не понял... Вот, мы разложили данные на несколько кучек (или, быть может, даже куч) в MongoDB, PostgreSQL и т.д. А потом нам понадобилось построить по этим данным какую-нибудь аналитику, например. Придётся создавать ещё одну распределенную команду, которая будет пилить ETL-процедуры, поминая недобрыми словами разработчиков микросервисов, которые не особо заморачивались с целостностью данных, дублированием, нормализацией, просто сваливали всё в NoSQL базу и т.д. Хотя нет, лучше сделать несколько таких команд, каждая из которых будет пилить ETL-процедуры под свои витрины. Вот, тогда наступит полное счастье и распределенность!

    Извиняюсь за сарказм :) У меня стойкое ощущение, что подавляющее большинство разработчиков относятся к схеме данных как к внутренним техническим деталям реализации. И типа это личное дело разработчиков каждого отдельного микросервиса как структурировать данные, как называть таблицы и столбцы, какие технологии использовать, в какой момент взять и перефигачить полностью схему данных, потому что Agile и нужно срочно делать очередной релиз. Как будто эти данные нигде и никогда за пределами микросервиса использоваться не будут. Я лично насмотрелся на ужасы БД-строения и у меня посттравматический синдром стойкая убежденность, что схема данных на предприятии должна быть одна, за неё должен отвечать один человек или небольшая группа людей, они принимают решение о том как разложить её на несколько СУБД, если требуется. А разработчики микросервисов - это пользователи этой единой схемы данных.

    Либо другой вариант. Каждый микросервис - это фактически отдельное приложение, на разработку которого нет возможности как-то влиять, ну, пилят они у себя там что-то и пилят. При этом невозможно понять что именно пилят и, уж, тем более как-то повлиять на это. От безысходности бытия приходится придумывать какие-то другие механизмы интеграции, шину какую-нибудь сделать, нафигачить тонны сложных ETL-процедур.


  1. Vottakonotak
    27.09.2022 11:04

    А разве каждый endpoint не выходит на микросервис в монолите? Или они должны быть в отдельных файлах?

    Я подозреваю, что главное отличие в том, что монолит сидит на одном порте, а микросервесы на нескольких. Только так я могу понять как при падение одного, другое будет работать исправно.


    1. hard2018
      27.09.2022 11:51

      В разные интерфейсы смотрят.
      И что такое эндпоинт?