Микросервисы против монолитной архитектуры
Я немного почитал про микросервисы и немного заинтригован. Кажется, это интересная концепция. Но мне интересно, каковы преимущества и недостатки использования микросервисов по сравнению с монолитной архитектурой и наоборот.
Когда микроуслуги подойдут лучше, а куда лучше пойти с монолитной архитектурой.
3 ответа
Хотя я относительно новичок в мире микросервисов, я постараюсь ответить на ваш вопрос как можно полнее.
Когда вы используете архитектуру микросервисов, вы увеличите разделение и разделение проблем. Так как вы буквально разделяете вашу заявку.
Это приводит к тому, что вашей кодовой базой будет легче управлять (каждое приложение не зависит от других приложений, чтобы оставаться в рабочем состоянии). Поэтому, если вы сделаете это правильно, в будущем будет проще добавлять новые функции в ваше приложение. Принимая во внимание, что с монолитной архитектурой, это может быть очень трудно сделать, если ваше приложение большое (и вы можете предположить, что в какой-то момент времени оно будет).
Кроме того, развертывание приложения проще, поскольку вы создаете независимые микросервисы отдельно и размещаете их на отдельных серверах. Это означает, что вы можете создавать и развертывать службы в любое время без необходимости перестраивать оставшуюся часть приложения.
Поскольку различные службы малы и развернуты по отдельности, очевидно, что их легче масштабировать, с тем преимуществом, что вы можете масштабировать конкретные службы вашего приложения (с монолитным масштабированием вы получаете всю "вещь", даже если это просто определенная часть внутри приложение, которое получает чрезмерную нагрузку).
Тем не менее, для приложений, которые не предназначены для слишком большого управления в будущем. Лучше сохранить его при монолитной архитектуре. С архитектурой микросервисов связаны некоторые серьезные трудности. Я заявил, что проще развертывать микросервисы, но это верно только по сравнению с большими монолитами. Используя микросервисы, вы получаете дополнительную сложность распределения сервисов на разных серверах в разных местах, и вам нужно найти способ управлять всем этим. Создание микросервисов поможет вам в долгосрочной перспективе, если ваше приложение станет большим, но для небольших приложений легче оставаться монолитным.
Это очень важный вопрос, потому что несколько людей заманивают на шум вокруг микросервисов, и есть некоторые компромиссы. Итак, каковы преимущества и проблемы микросервисов (по сравнению с монолитной моделью)?
Выгоды
- Возможность развертывания: больше гибкости для развертывания новых версий службы благодаря более коротким циклам сборки + тестирования + развертывания. Кроме того, гибкость использования конфигураций безопасности, репликации, постоянства и мониторинга для конкретных служб.
- Надежность: ошибка микросервиса влияет только на этот микросервис и его потребителей, в то время как в монолитной модели ошибка обслуживания может разрушить весь монолит.
- Доступность: развертывание новой версии микросервиса требует небольшого времени простоя, тогда как развертывание новой версии службы в монолите требует обычно более медленного перезапуска всего монолита.
- Масштабируемость: каждый микросервис можно масштабировать независимо, используя пулы, кластеры, сетки. Характеристики развертывания делают микросервисы идеальным выбором для эластичности облака.
- Модифицируемость: большая гибкость в использовании новых платформ, библиотек, источников данных и других ресурсов. Кроме того, микросервисы являются слабосвязанными модульными компонентами, доступными только по их контрактам, и, следовательно, менее склонны превращаться в большой шарик грязи.
- Управление: усилия по разработке приложений разделены на группы, которые меньше по размеру и работают более независимо.
- Автономность проектирования: у команды есть свобода использования различных технологий, структур и шаблонов для проектирования и реализации каждого микросервиса, и они могут изменять и повторно развертывать каждый микросервис независимо
проблемы
- Возможность развертывания: гораздо больше единиц развертывания, поэтому есть более сложные задания, сценарии, области переноса и файлы конфигурации для наблюдения за развертыванием. (По этой причине непрерывная доставка и DevOps очень желательны для микросервисных проектов.)
- Производительность: сервисы, скорее всего, должны обмениваться данными по сети, тогда как сервисы в пределах монолита могут выиграть от локальных вызовов. (По этой причине дизайн должен избегать "болтливых" микросервисов.)
- Модифицируемость: изменения в контракте с большей вероятностью повлияют на потребителей, развернутых в других местах, тогда как в монолитной модели потребители, скорее всего, окажутся в пределах монолита и будут развернуты в одном шаге с сервисом. Кроме того, механизмы улучшения автономии, такие как возможная согласованность и асинхронные вызовы, увеличивают сложность микросервисов.
- Тестируемость: интеграционные тесты сложнее настроить и запустить, потому что они могут охватывать разные микросервисы в разных средах выполнения.
- Управление: усилия по управлению операциями увеличиваются, потому что есть больше компонентов времени выполнения, файлов журналов и взаимодействий точка-точка для наблюдения.
- Использование памяти: несколько классов и библиотек часто реплицируются в каждом микросервисном пакете, и общий объем памяти увеличивается.
- Автономия во время выполнения: в монолите общая бизнес-логика расположена совместно. С микросервисами логика распространяется на микросервисы. Таким образом, при прочих равных, более вероятно, что микросервис будет взаимодействовать с другими микросервисами по сети - это взаимодействие уменьшает автономность. Если взаимодействие между микросервисами связано с изменением данных, необходимость в транзакционной границе еще больше ставит под угрозу автономию. Хорошая новость заключается в том, что во избежание проблем с автономностью во время выполнения мы можем использовать такие методы, как конечная согласованность, управляемая событиями архитектура, CQRS, кэш (репликация данных) и выравнивание микросервисов в контексте DDD. Эти методы не присущи микросервисам, но были предложены практически каждым автором, которого я читал.
Как только мы поймем эти компромиссы, нам нужно знать еще одну вещь, чтобы ответить на другой вопрос: что лучше, микроуслуги или монолит? Нам необходимо знать нефункциональные требования (требования к качеству) приложения. Например, когда вы поймете, насколько важна производительность по сравнению с масштабируемостью, вы можете взвесить компромиссы и принять взвешенное проектное решение.
@Luxo на месте. Я просто хотел бы предложить небольшое изменение и привести организационную перспективу этого. Микросервисы не только позволяют отделить приложения, но также могут помочь на организационном уровне. Например, организация сможет разделиться на несколько групп, каждая из которых может разрабатывать набор микросервисов, которые может предоставить группа.
Например, в более крупных магазинах, таких как Amazon, у вас может быть команда по персонализации, команда по электронной коммерции, команда по инфраструктурным услугам и т. Д. Если вы хотите использовать микросервисы, Amazon является очень хорошим примером этого. Джефф Безос поручил командам взаимодействовать с услугами другой команды, если им нужен доступ к общим функциям. Смотрите здесь для краткого описания.
Кроме того, инженеры из Etsy и Netflix также провели небольшую дискуссию в день микросервисов против монолита в Twitter. Дискуссия немного менее техническая, но может также предложить несколько идей.