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

В чем плюсы микросервисной архитектуры?
В микросервисной архитектуре есть множество плюсов, которые привлекли внимание разработчиков по всему миру.
Одним из главных преимуществ данной архитектуры служит масштабируемость и гибкость. Каждый микросервис можно масштабировать независимо от других, исходя от его конкретных потребностей. Такая детализированная масштабируемость позволяет эффективно распределять ресурсы и обеспечивает оптимальную производительность, особенно при работе с меняющимися требованиями к рабочей нагрузке.
Также для микросервисов характерно технологическое разнообразие и автономия. Каждый сервис работает обособленно, так что можно подобрать для него разные технологии и фреймворки – если только их интерфейсы не зависят от технологий (например, используют HTTP API или веб-сокеты). Это открывает целый мир возможностей и позволяет командам выбирать лучшие инструменты для реализации конкретных задач. Микросервисы похожи на динамичную экосистему, в которой каждый сервис может эволюционировать и улучшаться в собственном темпе.
Непрерывная доставка и развертывание – еще одни важные плюсы микросервисной архитектуры. Сервисы не имеют привязки друг к другу, благодаря чему их можно разрабатывать, тестировать и развертывать обособленно. Это сокращает срок вывода на рынок, ведь новые функции и обновления можно развертывать без изменения всего приложения. У вас как будто есть целый гибкий набор сервисов, готовых адаптироваться и улучшаться в любое время. Кроме того, все это позволяет работать над каждым микросервисом сразу нескольким командам, благодаря чему существенно ускоряется время разработки.
В целом, микросервисы – довольно удобные и продуманные. Но, как и везде в нашей отрасли, какой бы гениальной технология не была, ей никогда не стать эталоном. В микросервисах есть ряд существенных недочетов, о которых необходимо знать.
В чем минусы микросервисов?
В свободе и гибкости микросервисов есть и обратная сторона.
Одним из недочетов микросервисной архитектуры являются сложности с управлением распределенной системой. Для координации взаимодействия между сервисами, обеспечения согласованности данных и обработки сбоев необходимо скрупулезное проектирование и внедрение. Ведь, по сути, если у вас есть множество микросервисов, то им же нужно как-то обращаться между собой, обмениваться данными… а как быть, если один из них вдруг выйдет из строя? Как восстановить после этого другие сервисы? Где каждый сервис будет хранить свои данные? Все эти вопросы необходимо задать себе до запуска продукта. А теперь представьте, что у вас есть 30 микросервисов… или даже 100 (причем для крупных систем это не так уж и много). Сможете ли вы ответить на все эти вопросы по каждому сервису?
Теперь понимаете, в чем дело?
Также следует учитывать издержки на координацию и взаимодействие процессов. Чем больше сервисов становится, тем сложнее поддерживать их взаимодействие и согласованность данных. Получается, что для реализации эффективных процессов взаимодействия нужны дополнительные средства (например, API или очереди сообщений).
Итого: микросервисная архитектура может похвастаться масштабируемостью, технологическим разнообразием и непрерывной доставкой. Однако все это сопряжено с рядом трудностей, связанных со сложностью этой архитектуры, распределенными системами и взаимодействием между сервисами.
Сравнение монолитной и микросервисной архитектуры
Для краткого и наглядного анализа давайте сравним монолитную и микросервисную архитектуру по пунктам. Так сразу увидим различия в каких-то аспектах.

То, какой вариант вы выберете, зависит от множества факторов, включая требования к проекту, опыт команды и потребность в масштабируемости. Таблица выше поможет вам понять плюсы и минусы двух подходов.
Выбор монолитной или микросервисной архитектуры
Теперь вы разобрались в двух сторонах одной архитектурной медали. Единственное, что осталось, – это сделать правильный выбор. Опять же, задача не самая простая. И прежде, чем сделать выбор, необходимо учесть множество факторов. Поэтому мы быстро рассмотрим несколько примеров использования каждой архитектуры, и вы увидите, где и что лучше подойдет.
Популярные примеры использования монолитной архитектуры
Для начала рассмотрим несколько примеров удачного выбора монолитной архитектуры:
Приложения для малого и среднего бизнеса. Сравнительно простым приложениям с ограниченным функционалом и небольшими командами разработки монолитная архитектура может предложить понятное и демократичное решение. Простота единой базы кода и среда совместно используемых данных может ускорить процессы разработки и обслуживания.
Проекты прототипирования и проверки концепции (proof-of-concept или PoC). Когда проект находится на ранних этапах, а вы хотите быстро проверить идеи или протестировать концепции, то практичнее будет обратиться к монолитам. Простота такой архитектуры позволяет использовать быстрые этапы разработки, помогая вам эффективно разбивать процесс на части и собирать обратную связь. Нет нужды выстраивать полноценную масштабируемую и гибкую PoC-систему. В ней вы будете тратить время на решение проблем, не связанных с самой концепцией, которую хотите доказать.
Среды с ограниченными ресурсами. Монолитная архитектура может стать хорошим решение для определенных сред с ограниченными ресурсами инфраструктуры или возможностями развертывания. Для работы такой системы требуется меньше ресурсов (по сравнению с установкой распределенного микросервиса), так что она лучше подходит для сред с аппаратными или финансовыми ограничениями.
Приложения одной функции. Приложения, выполняющие одну четко определенную функцию без сложной интеграции или существенных требований к масштабируемости, только выиграют от монолитной архитектуры. Все приложение работает в рамках единого процесса, и монолиты могут обеспечить эффективную производительность для такого рода узконаправленных задач. Кроме того, если вам потребуется масштабировать систему, то вы можете просто добавить больше реплик монолита под подсистему балансировки нагрузок, и, тем самым, решить эту проблему.
Унаследованные системы (Legacy-системы). Модернизация и миграция унаследованных систем – задача весьма сложная. В ряде случаев практичнее будет сохранить существующую монолитную архитектуру и постепенно провести рефакторинг системы, либо же добавить в нужные места микросервисы. В данном подходе вы осуществляете поэтапный переход, сводя к минимуму сбои и эффективно пользуясь существующей кодовой базой.
Это не все примеры, важно уловить ключевой смысл.
Популярные примеры использования микросервисной архитектуры
Микросервисная архитектура предлагает множество достоинств, из-за чего в ряде случаев кажется весьма привлекательным выбором. Давайте рассмотрим несколько примеров, в которых удачно вписались микросервисы:
Крупные и сложные системы. Микросервисы – это настоящая находка при работе с крупномасштабными приложениями со сложным функционалом. Разбивка системы на более мелкие и независимые сервисы помогает в качественной организации, обслуживании и масштабируемости. Каждый сервис может заниматься определенными бизнес-возможностями, что делает разработку и обслуживание более легкими в управлении.
Высокая масштабируемость и эластичность. Приложения с непостоянными или непредвиденными рабочими нагрузками гарантированно выиграют от использования микросервисов. Детализированная масштабируемость позволяет масштабировать каждый сервис по отдельности, исходя из ваших конкретных требований. Это гарантирует эффективное использование ресурсов. Вы можете выделять ресурсы именно там, где они нужны, обеспечивая, тем самым, оптимальную производительность и экономичность.
Технологическая разнородность. Если для компонентов проекта нужны разные технологии или фреймворки, то гибкость микросервисов поможет вам это реализовать. Каждый сервис можно создавать на том стеке технологий, который лучше всего подойдет под его конкретные требования. Получается, что команды разработки могут пользоваться сильными сторонами различных технологий и подбирать идеальные инструменты для работы.
Непрерывное развертывание и культура DevOps. Микросервисы отлично согласуются с принципами непрерывной интеграции, доставки и развертывания. Дело в том, что каждый сервис можно разрабатывать, тестировать и развертывать отдельно от остальных, что позволяет быстрее проходить все этапы работы и ускоряет выход продукта на рынок. Данный подход поддерживает гибкую и ориентированную на DevOps культуру разработки, способствуя более частому и быстрому выходу релизов.
Предметно-ориентированное проектирование. Приложениям со сложными моделями предметной области и своим собственными ограниченным контекстом также подходят микросервисы. Соотнося сервисы с определенными подобластями, вы сможете добиться более качественного распределения обязанностей, инкапсуляции и масштабируемости. Такая модель поддерживает модульный подход, в котором каждый микросервис занимается определенными бизнес возможностями и развивается обособленно.
Важно помнить так же и все минусы микросервисов, что бы сделать правильный выбор.
Микросервисы и монолиты. Что лучше?
Помните, что в вопросах архитектуры ПО идеального решения нет. Правильная архитектура зависит от ваших конкретных требований к проекту и организационному контексту. Прежде чем проектировать систему, следует изучить все главные вопросы и понять, что действительно подойдет для вашего проекта.