При разработке приложений не всегда целесообразно ограничиваться стандартной монолитной архитектурой. Появление новых технологий открывает массу возможностей для решения целого спектра бизнес-проблем, а принципы микросервисной архитектуры способствуют более быстрому выходу на рынок и повышению гибкости целого проекта. Говорят, что микросервисы даже являются движущей силой цифровой трансформации. Тем не менее, и у монолитной системы есть свои преимущества. Однако в каких же случаях следует сделать выбор в пользу монолитной архитектуры, а в каких - в пользу микросервисов?
Несмотря на свое название, монолит - это не устаревшая архитектура, которую можно навсегда оставить в прошлом. Это, скорее, более традиционный способ создания приложений как единого и неделимого целого. По мере добавления новых функций и изменений в одну и ту же базу кода она со временем будет расти. Такой подход хорошо подходит для небольших команд разработчиков и несет в себе соответствующие преимущества. Монолит обычно имеет серверное приложение, пользовательский интерфейс и единую базу данных. Все функции управляются и обслуживаются в одном месте, что является преимуществом в некоторых случаях.
Монолитное приложение легко разрабатывать, тестировать и развертывать. После развертывания вы просто настраиваете его с учетом текущих требований. Поскольку все выполняется в одном приложении, сквозные проблемы, связанные с логированием, обработкой данных, кешированием и безопасностью, легко решаются, поскольку память, дисковое пространство и прочие ресурсы используются совместно разными компонентами.
Кроме того, монолитный подход также превосходит микросервисный в производительности, поскольку доступ к памяти осуществляется быстрее, чем, например, межпроцессное взаимодействие (ICP).
Возможные сценарии запуска приложения с монолитной архитектурой:
Монолитная архитектура неспроста считается традиционным подходом в построении проекта и разработке программного обеспечения, однако в современных условиях, когда на первый план выходит необходимость адаптироваться под новые вызовы, классическое решение все чаще уступает свои позиции, зачастую когда это касается крупных развивающихся проектов.
В этой быстро меняющейся, быстрорастущей рыночной среде недостатки монолитной архитектуры приложений становятся очевидными.
Сложность программного обеспечения. Успешное приложение постоянно развивается, чтобы не отставать от меняющихся требований. В результате монолитные приложения становится сложнее поддерживать, не говоря уже о том, чтобы их структуру и логику полностью понимали разработчики, работающие над ними.
Распределение ответственности. Крупное приложение может быть воспринято как черный ящик, за который никто не хочет брать на себя ответственность. Из-за невозможности четкого распределения на зоны ответственности у отдельных разработчиков может возникнуть нежелание работы с приложением, построенным на монолитной архитектуре.
Отсутствие гибкости. В монолитных приложениях команды обычно структурируются в соответствии с их индивидуальными функциями, такими как интерфейс, бэкэнд или базы данных. Когда делается запрос, который затрагивает все эти команды, работа над результирующими проектами может отнять много времени, потому что задачи должны быть разделены между несколькими разными членами команды.
В централизованной архитектуре отдельные части сильно взаимосвязаны и зависят друг от друга. Это приводит к возникновению единой точки отказа, которая может вывести из строя всю систему.
Неэффективное тестирование. Из-за того, что в монолитных приложениях присутствуют единые точки отказа, всестороннее и повторное тестирование становится критически важным. Если изменяется только одна небольшая часть приложения, весь функционал необходимо тестировать заново.
Отсутствие специализации. В сильно связанном приложении к отдельным компонентам обычно обращаются одинаково в зависимости от количества ресурсов, к которым у них есть доступ - независимо от того, какая часть требует большего или меньшего количества процессорных мощностей, ОЗУ или операций ввода-вывода.
Проблемы с масштабированием. Для большинства монолитных приложений горизонтальное масштабирование - единственный вариант, который, в свою очередь, создает множество других проблем. Вполне понятно, что компании, которым необходимо двигаться быстрее и внедрять инновации, пытаются найти способы обойти эти ограничения.
Подход с использованием микросервисов превращает каждую бизнес-возможность в отдельные сервисы. Главное отличие микросервисной архитектуры от монолитной заключается в том, что каждый процесс приложения функционирует как отдельный слабо связанный сервис со своей собственной логикой и базой данных. Обновление, развертывание, тестирование и масштабирование происходит в рамках отдельного модуля.
Несмотря на то, что микросервисы не уменьшают сложность системы, они делают ее более управляемой. В зависимости от необходимости, одна и та же услуга может быть повторно использована в нескольких бизнес-процессах и точках взаимодействия. Благодаря стандартизации с помощью бизнес-ориентированных API-интерфейсов пользователи не замечают никаких изменений, внесенных в серверную часть.
На примере таких крупных сервисов, как Netflix, Airbnb, Google, Disney и Amazon, микросервисы стали пользоваться высоким спросом на рынке развивающихся IT-проектов. Во многом это заслуга тех преимуществ, которые несут в себе лучшие практики использования микросервисной архитектуры.
Соответствие высоким требованиям. Микросервисы могут обеспечить максимальную гибкость, скорость и масштабируемость. Приложения с экстремальными требованиями лучше всего вписываются именно в микросервисную архитектуру, которая может удовлетворить запросам каждой из служб разрабатываемого приложения.
Комплексное решение. На этапе проектирования микросервисов их границы должны быть четкими, чтобы можно было согласовать их с бизнес-возможностями. В доменно-ориентированном проектировании это также известно как ограниченный контекст. Такой подход позволяет вам использовать наиболее эффективный язык для каждого домена.
Экспертиза в микросервисах. Чтобы начать работу с микросервисами, вам понадобится команда, имеющая некоторый опыт работы с микросервисами или распределенным дизайном. Эту задачу рекомендуется делегировать специалистам по DevOps и контейнерам, поскольку эти концепции тесно связаны с микросервисами.
Возможность реализовать сложный проект. Если вы планируете большое приложение с несколькими модулями и пользовательскими циклами, которые приводят к высокой сложности приложения, микросервисная архитектура подходит лучше всего. В будущем это позволит значительно упростить масштабирование и добавление новых возможностей.
Несмотря на все преимущества построения проекта на базе микросервисной архитектуры, этот подход не является универсальным. Не следует делать выбор в пользу микросервисов только потому, что вы видите, что другие организации успешно используют их. Подход с использованием микросервисов подходит не для всех бизнес-задач и не приводит к волшебному исчезновению сложности разработки и обслуживания.
Внедрение микросервисов не упростит электронную коммерцию и развитие бизнеса в целом. Прежде чем внедрять архитектуру в свое приложение, рассмотрите следующие недостатки микросервисов по сравнению с монолитным подходом.
Общие проблемы. Каждому микросервису приходится иметь дело с рядом сквозных проблем, таких как логирование, ведение метрик, проверки работоспособности, внешнее конфигурирование. Скорее всего, вы не закладывали их в процесс разработки. Вы можете заложить расходы на обслуживание каждого модуля по отдельности. Или, в качестве альтернативы, используйте их на другом уровне обслуживания, через который маршрутизируется весь трафик.
Более высокие затраты. Построение микросервисной архитектуры требует большей нагрузки на развертывание и мониторинг, что напрямую связано с более высокими операционными накладными расходами. Поскольку службы обмениваются данными друг с другом, большое количество удаленных вызовов может привести к более высоким ресурсным затратам, связанным с задержкой в сети и обработкой данных. А поскольку каждый микросервис развертывается независимо и требует собственной среды выполнения и процессорных мощностей, потребность в ресурсах возрастает.
Организационные изменения. Каждая команда должна охватить весь жизненный цикл микросервиса, чтобы стать полностью независимой: от дизайна и концепции, технических решений и реализации до текущих операций и мониторинга. Это требует организационных изменений, таких как передача полномочий от менеджеров командам. Культура DevOps, которая также опирается на методы автоматизации, настоятельно рекомендуется для успешной адаптации подхода с использованием микросервисов.
Микросервисная архитектура приложения становится все более востребованной. Однако для решения определенной бизнес-задачи, оцененной с учетом перечисленных выше плюсов и минусов, важно определиться, следует ли вам начинать с монолита или микросервисов.
Для легкого приложения часто лучше подходит монолитная система. Для сложного, развивающегося приложения с определенными доменами архитектура микросервисов будет лучшим выбором.
Главный вывод - следует сосредотачиваться не на архитектурном подходе, а на конкретных потребностях вашей организации. Это поможет избежать излишней сложности при разработке приложений.