Как масштабируются монолиты и микросервисы

Логотип компании
Как масштабируются монолиты и микросервисы
Какие преимущества и недостатки имеют монолитная и микросервисная архитектуры? Какую архитектуру целесообразно использовать? В чем разница масштабирования монолитных и микросервисных архитектур?

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

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

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

Крупные корпоративные информационные системы, такие как ERP (Enterprise Resource Planning) и CRM (Customer Relationship Management), также традиционно строились как монолиты, что обеспечивало интеграцию всех бизнес-процессов в единое целое.

Какие преимущества и недостатки имеет монолитная архитектура?

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

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

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

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

В каких случаях использование монолитной системы целесообразно?

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

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

Во-вторых, монолит подойдет для проектов прототипирования и проверки концепции (proof-of-concept или PoC). Для начальных этапов разработки, когда нужно быстро проверить идеи, монолиты предлагают простоту и скорость. Они идеальны для создания MVP (минимально жизнеспособного продукта), позволяя быстро собрать обратную связь без лишних затрат на инфраструктуру. В Inetstudio мы часто запускам MVP как монолит. Это позволяет нам быстро проверить корректность наших идея для внутренних проектов, заложить основной функционал, которым уже можно пользоваться. А дальше постепенно обновляем приложение и мигрируем на микросервисы.

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

Наконец, использование монолита оправдано для унаследованных систем (Legacy-системы). Модернизация и миграция унаследованных систем – это сложные процессы. Часто практичнее будет сохранить существующую монолитную архитектуру и постепенно провести рефакторинг системы, либо добавить в нужные места микросервисы. Так получается поэтапный переход, сводятся к минимуму сбои.

Что такое микросервисная архитектура?

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

Микросервисная архитектура тесно связана с практиками DevOps и методиками непрерывной интеграции и доставки (CI/CD), что позволяет командам разработчиков быстро реагировать на изменения и обновлять приложение с минимальными перерывами в работе.

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

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

А, например, в нашей компании мы сейчас занимаемся обновлением одного из крупных порталов для врачей и фармацевтов. Ранее он был написан в монолите и уже очень сильно устарел. Мы освежили дизайн всего приложения, чтобы он соответствовал современным представлениям об UX/UI. Разбили его на отдельные логические блоки: админ-панель, личный кабинет, новостная лента, нотификации, аутентификация, логи и мониторинг, умный поиск, каталог обучений и сами обучения, база врачей, клинические случаи и пр. Также мы протипизровали весь код и покрыли весь важные функционал тестами.

Какими преимуществами обладает микросервисная архитектура?

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

Например, в одном из недавних проектов Proexpert у нас в INETstudio у нас были проблемы – редкий выход обновлений, сильная связанность кодовой базы и архитектуры. Раньше мы ждали пятницы, чтобы собрать все обновления и начать катить их в продашкн, ожидая всевозможных проверок валидации, тестов, сборки и самого деплоя около 1 часа (если повезет и на проде все будет в порядке, т.к. одна малейшая непредвиденная ошибка заставляла повторять весь ритуал заново). Сейчас мы можем заливать обновления сколько угодно раз в день, ожидая всего около 5-6 минут.

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

Благодаря микросервисам также становится возможным более гибкое масштабирование команд и географии регионов. Разделение сервисов по линиям владения улучшает управляемость, упрощает процесс обновления кода и ускоряет циклы релизов за счет непрерывной интеграции и непрерывной доставки (CI/CD). Команды могут свободно экспериментировать с новыми идеями и быстро откатываться к предыдущим версиям при возникновении ошибок, что уменьшает риски и увеличивает оперативность реагирования на изменения.

Недостатки микросервисной архитектуры

Когда мы перешли от небольшого количества монолитных баз кода к множеству распределенных систем и служб, которые теперь составляют основу наших продуктов, возникла непредвиденная сложность. Поначалу нам не удавалось добавлять новые возможности с прежней скоростью и уверенностью. Микросервисы могут сделать процесс разработки сложнее и привести к его разрастанию — быстрому и неуправляемому росту. Иногда бывает сложно определить, как различные компоненты связаны друг с другом, кто владеет конкретным программным компонентом или как избежать вмешательства в работу зависимых компонентов. С помощью проекта Proexpert мы создали общие функциональные возможности, которые станут основой существующих и будущих продуктов. Если ваша компания разрабатывает только один продукт, микросервисы могут и не понадобиться.

В каких случаях лучше использовать микросервисную архитектуру?

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

Микросервисы выгодны для приложений с изменчивыми или непредсказуемыми рабочими нагрузками. Netflix использует микросервисы для обработки колеблющегося количества потокового трафика от миллионов пользователей по всему миру. Отдельное масштабирование сервисов для рекомендаций, кэширования и потоковой передачи контента позволяет обеспечивать надежную производительность в пиковые часы.

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

Микросервисы предоставляют возможность использовать различные технологии и фреймворки для каждого компонента системы. Это позволяет командам выбирать наиболее подходящие инструменты для каждой задачи, оптимизируя процесс разработки и обеспечивая лучшую производительность. Twitter перешел к использованию микросервисов, что позволило различным командам выбирать стек технологий, наиболее подходящий для их сервисов. Например, одни сервисы могут использовать Scala, другие — Java, в зависимости от их специфических требований и предпочтений разработчиков.

В чем разница масштабирования монолитных и микросервисных архитектур?

Ключевые сервисы для масштабирования такие:

  • Docker — это платформа для контейнеризации приложений, которая позволяет упаковать приложение с его окружением в контейнер, который можно легко переносить и развертывать. Это особенно полезно в микросервисных архитектурах, где каждый сервис может быть запущен в своем собственном контейнере.
  • Kubernetes — это система оркестрации контейнеров, которая автоматизирует развертывание, масштабирование и управление контейнеризированными приложениями. Она подходит для управления микросервисами на большом количестве серверов.
  • Prometheus — это система мониторинга и оповещения, а Grafana — платформа для аналитики и мониторинга. Обе эти технологии часто используются вместе для мониторинга микросервисов и визуализации их работы.

В монолитах часто используются традиционные серверы или виртуальные машины. Для управления масштабированием могут применяться инструменты автоматизации, такие как Puppet, Chef или Ansible. В монолитах масштабирование преимущественно вертикальное, что означает добавление ресурсов (ЦПУ, память) к существующему серверу. Это может привести к дорогостоящим апгрейдам и ограниченной гибкости.

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

Опубликовано 27.04.2024

Похожие статьи