Просто пишите код. Часть 1

3237b6f9813dfe591aa337032f8b0407.jpg

Микросервисы: когда и зачем

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

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

Вопрос изоляции доменов (программной части и данных). Изоляция может быть реализована в виде микросервисов, service-based архитектуры, CQRS и других подходов. Выбор подхода зависит от логики, оценки положительных и отрицательных сторон изоляции по отношению к конкретному домену. К одному домену может быть применен один подход, к другому — другой, в зависимости от содержания домена и от способа взаимодействия команд ответственных за домены.

Статья — идейное продолжение моей статьи Борьба со сложностью

Доводы за изоляцию и альтернативы

Основные технологические доводы за изоляцию:

  1. Масштабирование: для обеспечения масштабирования есть множество иных, более дешевых способов: (шардирование, репликация или выделение аналитической части в CQRS). И только если они не помогли, то можно прибегнуть к паттерну микросервисов для обеспечения требований по масштабируемости.

  2. Безопасность: для таких доменов, как платежный модуль, изоляция в виде микросервиса является необходимостью ввиду требований к безопасности данных. Альтернативных подходов практически нет.

  3. Мультитехнологичность: альтернатив распределенным архитектурам (микросервисам или иным) чтобы обеспечить это требование почти что и нет. Но такая потребность возникает не так уж часто. Впрочем, если основная часть приложения написана на скриптовых языках (Python или PHP), а остальную часть для ускорения быстродействия необходимо переписать на Go, C# или Rust, то изоляция этой части кода будет хорошей идеей. Наличие или отсутствие требований изоляции данных определит будет ли это микросервис или иная архитектура, к примеру service-based architecture.

Организационные доводы за:

  • Микросервисы эффективны для Agile, когда количество команд превышает 5–10, и взаимодействие между командами становится затруднительным. При численности команды около 10 человек (по правилу двух пицц) и общей численности 50–100 человек на продукт имеет смысл изолировать практически каждый домен.

  • При росте сложности требований, кодовой базы и поведения программы изоляция уменьшает риск веерного изменения в зависимых модулях — усложнения разработки и тестирования. Да, через изоляцию доменов DDD на уровне логики можно добиться положительного эффекта, но для крупных программ может оказаться предпочтительней кардинальная изоляция зависимостей, предоставляемая микросервисами. В книге «Чистая архитектура» показано, насколько драматично может быть падение производительности разработки с ростом кодовой базы и усложнением требований, если не гарантировать изоляцию модулей.

Против

Технологические доводы против изоляции:

Для устранения этого необходимо применять сложные техники (например, паттерн Saga)

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

Организационные доводы против:

  • Если вы неверно определили границу домена или она изменилась вместе с бизнес процессом перенести эту границу будет уже значительно сложнее. Особенно не рекомендуется начинать с микросервисов или выбирать их «навырост». Monolith first!

  • При использовании Waterfall модели с вертикальным взаимодействием между командами или при небольшом количестве команд, когда взаимодействие еще не очень сложное, микросервисы не являются лучшим вариантом решения. При наличии статических анализаторов зависимостей и при надзоре техлида за зависимостями модульный монолит станет отличным решением! Для быстрого развертывания изменений можно посмотреть такие решения как Blue-Green Deployment, Feature Flags и т.д.

  • Микросервисы дают существенную нагрузку на DevOps и падение средней производительности в условных фичах на человека в день. Падение раза в 2–3.

  • Если одна команда отвечает за несколько доменов, можно попробовать макросервисы — несколько доменов в одном сервисе с одним кодом и базой. Границей макросервиса станет граница ответственности команды

Решение

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

Изоляция доменов в виде модульного монолита, микросервисов, CQRS, EDA или Service Based Architecture — это мощный инструмент для обеспечения масштабируемости, безопасности и гибкости архитектуры, но её применение требует взвешенного подхода с учётом организационных и технических особенностей проекта.

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

Интересные статьи на хабре про микросервисы из моих закладок

Как перейти от монолита к микросервисам без сложностей и рисков? Четыре проверенных паттерна

Проектирование отказоустойчивости IT-систем

Микросервисы в представлении среднего разработчика, и как всё на самом деле

Композитная архитектура: возвращение к монолиту на новом уровне

Заметки об основах программной архитектуры

© Habrahabr.ru