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

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

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

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

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

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

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

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

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

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

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

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

Против

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

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

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

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

Решение

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

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

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

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

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

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

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

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

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

@Dhwtj
26.01.2025 21:51 UTC
Первоисточник

Комментарии

@dersoverflow
26.01.2025 18:05 UTC
+2

на сегодняшний день, микросервисы - некогда и незачем!

как я уже здесь цитировал:

Если вы давно не смотрели на серверное оборудование, то обнаружите, что современные высокопроизводительные серверы — это целые датацентры в коробке! Я просто ткнул Dell и нашел следующие характеристики PowerEdge R960:

  • 240 ядер (4 сокета по 60 ядер в каждом)

  • 16 ТБ ОЗУ в 64 модулях DDR5 DIMM (это как 1000 приличных ноутбуков)

А если нужно хранилище, то вы можете подключить до 24 NVMe дисков — по 4 ТБ каждый, а это почти 100 ТБ высокоскоростного SSD! И если 240 ядер вам покажется маловато, то Intel анонсировала процессоры Xeon с 288... Уже прямо сейчас вы можете подключить два Xeon 6780 к PowerEdge R770 серверу, получив в общей сложности 288 ядер, по цене около USD 32k.

Большинство enterprise-scale архитектур основаны на предположении, что одной машины недостаточно для обработки требуемой рабочей нагрузки. Большинство облачных решений, особенно serverless, основаны на той же предпосылке: если вам нужно что-то масштабировать, то оно должно быть distributed! Вторым вопросом является отказоустойчивость: в распределенной, масштабируемой системе легче обработать отказ одного компонента и, таким образом, увеличить uptime.

Сколько операционных данных хранит ваше бизнес-приложение? 1 мегабайт на клиента? Тогда 1 миллион клиентов потребуют всего 1 ТБ. И у нас еще осталось довольно много свободного пространства — в оперативной памяти! 1000 запросов в секунду к in-memory database? Я почти гарантирую вам, что у вас больше, чем несколько ядер CPU будет простаивать. 10 000 запросов (40 на ядро ​​в секунду) или даже 50 000 звучит более правдоподобно.

А как насчет отказоустойчивости? Все постоянно выходит из строя, верно? По крайней мере, так сказал Werner Vogels, но это было в 2008 году, когда AWS была немного больше, чем S3, SQS и EC2, последний из которых только что вышел из публичной бета-версии и получил SLA — возможно, это взаимосвязано. Современные серверы имеют избыточные, сменные блоки питания и вентиляторы, диски с возможностью горячей замены, а некоторые, как утверждается, даже имеют сменную оперативную память! Тем не менее, вы не будете хранить все свои данные только в оперативной памяти, а будете писать в persistent log, который позволит вам восстановить состояние системы в случае сбоя. Для большого сервера это может занять некоторое время. Например, если у вас будет 2 сбоя оборудования в год и время восстановления составляет 30 минут, то вы все равно получите 4 девятки, примерно столько же, сколько вам обещает большинство облачных сервисов. В действительности вы, вероятно, разобьете свою систему на более мелкие компоненты: на высокодоступные, и другие, которые могут позволить себе немного более длительное MTTR.

https://www.linkedin.com/pulse/past-constraints-you-never-thought-sergey-derevyago-ien3f

@Dhwtj
26.01.2025 18:10 UTC
0

Ну вы статью то мою прочитали?

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

Ок, я добавлю туда вертикальное масштабирование.

@c0r3dump
26.01.2025 22:33 UTC
+1

Сервер хорош, конечно, но предположу, что покупать такой вот сразу себе мало кто решится - нужно дорасти по нагрузке и с микросервисами проще её наращивать постепенно. Да ещё часто не хочется вовсе владеть никаким железом тк нужно же его обслуживать, резервирование учесть, держать запасные части, а то умрёт рейд-контроллер - что будем делать? Тоже горячая замена есть? Да и географически в разных дата-центрах тоже имеет смысл размещаться, а так с одним большим сервером может всякое произойти, например его могут забрать просто как вещдок и увезти, и для этого даже не нужно доказать вину - достаточно наличия дела.

27.01.2025 00:08 UTC
+1

покупать такой вот сразу себе мало кто решится

а зачем его покупать сразу? сервер может расти за Прибылью.

в общем, парадигма ИЗМЕНИЛАСЬ! еще лет 10 назад каждая первая статья о Масштабировании вполне резонно отмечала, что Вертикальное Масштабирование вас НЕ вывезет...

но!

на сегодняшний день ваш Бизнес сдохнет раньше, чем вы исчерпаете возможности одного Хорошего Сервера.

ЗЫ расчлененка - дополнительная Сложность! зачем себе портить Жизнь, если можно не портить?

27.01.2025 06:49 UTC
0

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

Но остальные плюсы не потеряли актуальность, как и минусы.

27.01.2025 06:45 UTC
0

Обычно, несколько серверов одновременно. Но их сложнее синхронизировать

@
26.01.2025 20:25 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@Dhwtj
27.01.2025 06:44 UTC
+2

Микросервисы по простому это распределенная архитектура, когда отдельно от остального один или несколько экземпляров сервиса и его данные тоже отдельно.

И вот теперь сервис взаимодействует с остальной частью по сети.

  • Здравствуйте, сетевые задержки

  • Здравствуйте, сетевые ошибки

  • Здравствуйте, очереди и повторы

  • Зато можно отключить сервис, заменить и включить, использовать несколько версий одновременно

  • Зато можно задать потолок ОЗУ на каждый запрос, чтобы вся система не рухнула при котором запросе

  • Зато можно вкатить новый сервис без сложного интеграционного тестирования (но это можно и на монолите)

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

  • Здравствуйте, сложные и долгие изменения в нескольких БД сразу, ака распределенные транзакции.

  • Здравствуйте, некосистентность данных чтобы хоть как-то это ускорить

27.01.2025 21:26 UTC
+1

могут быть вариации же.

У меня обычно микросервисы не честные, например. Связанны через БД.

У каждой данные в своей схеме, но естественно с fk, чтобы не ходить в чужие схемы внаглую, обычно делаю view в схеме сервиса.

Много головной боли по поводу консистентности снимается. При этом приложения маленькие, логика изолирована, горизонтальное масштабирование возможно.

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

В общем кактусы есть, нету колючек.

Плюс в том, что базовая часть "микро" сервисов превратилась в библиотеки, подключаемые к конкретному проекту и немного кастомизируемая под конкретные задачи. Например профиль, или Api Gateway.

28.01.2025 04:09 UTC
-1

Так и говорите, service based architecture

@Fardeadok
28.01.2025 06:48 UTC
0

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

На скорость монолита всем чихать так что скорость оборудования это аргумент в пользу МС

@Dhwtj
28.01.2025 07:11 UTC
-1

Нет. Надо проектировать по доменной структуре, по DDD. Ну а дальше решать: отрезать конкретный домен или нет