Love Sharma, Alex XU / ByteByteGo
The Architect's Blueprint:
10 архитектурных стилей программного обеспечения и их паттерны
Перевод Тимура Фаизова
Архитектура играет ключевую роль в разработке программного обеспечения, определяя структуру и поведение системы. Она предоставляет основу для проектирования системы, определяя, как компоненты взаимодействуют друг с другом для достижения определённой функциональности. Ореди множества доступных архитектурных стилей и паттернов бывает очень непросто выбрать подход, что лучше других подходит для конкретного проекта или системы. Эта статья ByteByteGo призвана прояснить эти концепции, помогая вам принимать обоснованные решения в области архитектурных исследований и разработок.
Архитектурные стили в сравнении с архитектурными паттернами
Прежде чем мы углубимся в детали, важно различать архитектурные стили и паттерны, поскольку эти термины часто используются взаимозаменяемо, но имеют разные значения.
Архитектурные стили — это стратегии высокого уровня, предоставляющие абстрактную структуру для семейства систем. Архитектурный стиль улучшает разделение и способствует повторному использованию дизайна, часто решая повторяющиеся проблемы. Вы можете рассматривать его как тему или эстетику, которая направляет дизайн зданий или домов. Примерами могут служить многослойные (Layered), событийно-ориентированные (Event-Driven) и микросервисные (Microservices) стили архитектуры.
С другой стороны, архитектурные паттерны более предметны и специфичны для конкретной проблемы или модуля в системе. Они представляют структурированное решение архитектурных проблем, подробно описывая, как компоненты и взаимодействия должны быть организованы для определённой функциональности. Они похожи на шаблоны проектирования программного обеспечения, но работают на более высоком уровне абстракции. Примерами являются Модель-Представление-Контроллер (Model-View-Controller — MVC), издатель-подписчик (Publish-Subscribe) и бессерверные вычисления (Serverless).
В следующих разделах мы рассмотрим десять ключевых архитектурных стилей, каждый со своими паттернами, принципами, сильными и слабыми сторонами и областями применения. Эти стили включают многослойный (Layered), компонентно-ориентированный (Component-Based), сервисно-ориентированный (Service-Oriented), распределённый (Distributed System), доменно-ориентированный (Domain-Driven), событийно-ориентированный (Event-Driven), разделение ответственности (Separation of Concern), переводчик (Interpreter), параллелизм (Concurrency) и ориентированный на данные (Data-Centric). Понимая эти стили и паттерны, вы сможете лучше ориентироваться в архитектурном ландшафте и проектировать системы, которые надёжны, масштабируемы и легко поддерживаются. Давайте приступим!
В огромном полотне проектирования программного обеспечения стили это широкие мазки кисти, а паттерны — это замысловатые детали, которые придают жизнь шедевру.
Идеальная шпаргалка
Чтобы помочь вам ориентироваться в огромном разнообразии архитектурных стилей и паттернов, я создал шпаргалку, в которой собраны все ключевые моменты, обсуждаемые в этом блоге. Эта шпаргалка — удобное справочное руководство, с помощью которого вы можете быстро запомнить основные характеристики каждого архитектурного стиля и паттерна:

Шпаргалка по стилям архитектуры программного обеспечения

(Скачать в высоком разрешении)

1. Многослойный архитектурный стиль
Многослойный архитектурный стиль является одним из наиболее распространённых архитектурных паттернов. Он часто используется для традиционных веб-приложений и корпоративных приложений:

  • Принципы: Этот архитектурный стиль разделяет функциональность на отдельные слои. Типичный пример это 3-х уровневая архитектура: слой представления, бизнес-логики и слой хранения данных.
  • Преимущества: Легко понимать, тестировать и поддерживать; каждый слой может разрабатываться и обновляться независимо.
  • Недостатки: Это может привести к накладным расходам на производительность; внесение изменений, затрагивающих несколько слоёв, может быть сложным.
  • Применение: Веб-приложения, корпоративные приложения.
  • Антипаттерны: Циклические зависимости, пропуск слоёв.

Многослойный (n-tier) паттерн

Архитектура n-уровней делит систему на N слоёв, каждый из которых несёт определённую ответственность. Самое распространённое деление — на три слоя: представление, бизнес-логику и слой хранения данных.

Многослойный (n-tier) паттерн

Паттерн Чистая архитектура

(также известный как «Onion Architecture»)

Чистая архитектура (Clean Architecture), также известная как "Onion Architecture", представляет собой философию проектирования программного обеспечения, подчеркивающую разделение функциональности в системе. Она организует программное обеспечение в концентрические слои, с моделью предметной области в центре, окружёнными слоями, специфичными для приложения. Внешние слои зависят от внутренних слоёв, но не наоборот, что способствует высокому разделению и изоляции. Это позволяет изменениям в инфраструктуре, пользовательском интерфейсе или внешних структурах иметь минимальное влияние на бизнес-логику. Этот подход идеален для систем, требующих высокой поддерживаемости, тестируемости и независимости от пользовательского интерфейса, базы данных или внешних фреймворков.

Шаблон чистой архитектуры

2. Компонентно-ориентированный архитектурный стиль
Этот стиль подчеркивает разделение функциональности на различные слои в рамках программной системы:

  • Принципы: Этот стиль архитектуры организует систему в виде слабосвязанных, повторно используемых компонентов.
  • Преимущества: Высокий уровень повторного использования, гибкости и поддерживаемости.
  • Недостатки: Сложность управления компонентами и их взаимодействиями.
  • Применение: Веб-приложения, десктоп-приложения, распределённые системы.
  • Антипаттерны: Слишком большие компоненты, избыточные компоненты.

Объектно-ориентированный паттерн

Этот паттерн представляет собой парадигму, основанную на «объектах», которые могут содержать данные и код: данные в виде полей (часто называемых атрибутами) и код в виде процедур (часто называемых методами). Он способствует инкапсуляции, наследованию и полиморфизму, что упрощает проектирование, реализацию и поддержку сложных систем.

Паттерн «Микроядро»

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

Паттерн архитектуры микроядра

Паттерн «Плагин»

Этот паттерн позволяет добавлять новую функциональность в приложение путем добавления новых модулей или плагинов. Новые модули интегрируются в приложение через стандартный интерфейс, что позволяет расширять и настраивать приложение. Этот паттерн часто используется в веб-браузерах, медиаплеерах и системах управления контентом.
3. Сервисно-ориентированный архитектурный стиль
Этот стиль разрабатывает программное обеспечение в виде набора сервисов, взаимодействующих друг с другом. Каждый сервис является автономным и представляет определённую бизнес-активность с определённым результатом.

  • Принципы: Архитектура SOA проектирует приложения в виде набора сервисов, которые обмениваются данными через сеть.
  • Преимущества: Гибкость, масштабируемость, повторное использование и слабая связанность.
  • Недостатки: Повышенная сложность, зависимость от сети и возможные проблемы с производительностью.
  • Применение: Корпоративные системы, веб-сервисы, микросервисы.
  • Антипаттерны: Игнорирование бизнес-потребностей, применение SOA там, где это не требуется.

Сервисно-ориентированный архитектурный паттерн (SOA)

Этот паттерн проектирует программное обеспечение в виде набора отдельных сервисов, используемых в нескольких системах. Каждый сервис в модели SOA предназначен для выполнения конкретной бизнес-функции, таких как: проверка кредитного рейтинга клиента, расчёт платежа или обработка ипотеки. Эти сервисы взаимодействуют друг с другом через сеть для достижения определённой активности, такой как: обработка заявки на ипотеку. SOA способствует многократному использованию, поскольку сервисы могут использоваться несколькими приложениями, а также гибкости, поскольку сервисы могут быть изменены или заменены без ущерба для других сервисов.

Архитектурный паттерн сервис-ориентированной архитектуры (SOA)

Паттерн «Брокер»

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

Паттерн «Микросервисы»

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

Архитектурный паттерн «Микросервисы»

Бессерверный паттерн (функции как сервис или FaaS)

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

  • Принципы: Эта архитектура предполагает, что несколько систем работают вместе через сеть, чтобы представлять собой единую систему для конечного пользователя.
  • Преимущества: Масштабируемость, устойчивость к сбоям и общий доступ к ресурсам.
  • Недостатки: Увеличенная сложность, зависимость от сети и проблемы, связанные с согласованностью данных.
  • Применение: Распределённые базы данных, облачные вычисления, телекоммуникационные сети.
  • Антипаттерны: Не учитываются сбои в сети, игнорируются проблемы с согласованностью данных.

Паттерн «Пространство данных» (Space-Based Pattern)

Этот паттерн, также известный как «Пространство кортежей» или «Облачная архитектура», предназначен для избежания единой точки отказа или узкого места производительности, путем равномерного распределения сервисов и ресурсов по нескольким серверам. Он идеален для высоконагруженных приложений, критичных для выполнения задач, требующих 100% безотказной работы и горизонтального масштабирования, таких как финансовые торговые системы или онлайн-платформы для игр.

Архитектурный паттерн «Микросервисы»

Паттерн «Одноранговая сеть» (Peer-to-Peer, P2P)

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

Архитектурный паттерн «Одноранговая сеть»

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

  • Принципы: Ориентирован на основную предметную область и логику предметной области и основывает дизайн на модели предметной области.
  • Преимущества: Повышение понимания сложных бизнес-доменов и стимулирование общения между техническими и бизнес-командами.
  • Недостатки: Может быть излишним для простых доменов и требует глубокого понимания.
  • Применение: Сложные бизнес-системы, корпоративное ПО.
  • Антипаттерны: Игнорирование единого языка, не включение предметных экспертов.

Шестигранный паттерн (Hexagonal, Ports & Adapters)

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

Шестигранный архитектурный паттерн

Паттерн Предметно-ориентированного проектирования (Domain-Driven Design — DDD)

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

Архитектурный паттерн предметно-ориентированного проектирования

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

  • Принципы: Этот стиль архитектуры основан на событиях, таких как действия пользователей, сигналы датчиков или сообщения от других программ.
  • Преимущества: Высокая масштабируемость, слабая связанность, стимулирование потока информации в реальном времени или практически в реальном времени.
  • Недостатки: Увеличенная сложность из-за асинхронного программирования, может быть сложно поддерживать и отлаживать.
  • Применение: Приложения с графическим интерфейсом, системы реального времени для анализа данных, сложные системы обработки событий.
  • Антипаттерны: Игнорирование порядка событий, отсутствие устойчивости событий.

Событийно-ориентированный паттерн

(Event-Driven Pattern)

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

Событийно-ориентированный архитектурный паттерн

Паттерн «Издатель-подписчик» (Pub-Sub Pattern)

Это паттерн обмена сообщениями, где отправители сообщений, известные как издатели (publishers), не направляют сообщения непосредственно конкретным получателям, известным как подписчики (subscribers). Вместо этого опубликованные сообщения объединяются по темам без знания о том, есть ли подписчики на них. Точно так же подписчики выражают интерес к одной или нескольким темам и получают только сообщения, которые их интересуют, не зная, есть ли издатели, которые их отправили. Этот паттерн широко используется в асинхронных системах для разделения процессов, которые производят события и процессов, которые их обрабатывают, что позволяет добиться большей масштабируемости и управления.
7. Архитектурный стиль разделения ответственности
Принцип разделения ответственности (Separation of concerns) — это принцип проектирования, позволяющий разделить компьютерную программу на отдельные разделы, каждый из которых обрабатывает отдельную задачу.

  • Принципы: Различные области функциональности обрабатываются отдельными, независимыми разделами системы.
  • Преимущества: Улучшает понимаемость кода, уменьшает сложность, способствует модульности и параллельной разработке.
  • Недостатки: Это может увеличить сложность из-за управления интерфейсами и потребовать больше коммуникации между модулями.
  • Применение: Практически все типы программных систем.
  • Антипаттерны: Смешивание функциональности, отсутствие четких границ модулей.

Паттерн "MVVC" (Model-View-ViewModel)

Этот паттерн упрощает разделение разработки графического пользовательского интерфейса от бизнес-логики или логики на стороне сервера. View-контроллер MVVC отвечает за предоставление объектов данных из модели, чтобы эти объекты легко управлялись и представлялись. Этот паттерн широко используется в областях с интенсивным взаимодействием с пользователями, таких как настольные и мобильные приложения.

Паттерн "MVP" (Model-View-Presenter)

Это модификация архитектурного паттерна "Model-View-Controller" (MVC), применяемая в основном для построения пользовательских интерфейсов. В паттерне MVP представитель (presenter) берет на себя роль среднего звена. Модель (model) и представление (view) полностью разделены и общаются друг с другом только через представителя. MVP является отличной архитектурой для современных веб-приложений, так как она облегчает автоматизированное модульное тестирование и предоставляет четкую структуру для проекта.

Архитектурный паттерн «Model-View-Presenter»

8. Архитектурный стиль «Переводчик»
Паттерн интерпретатора (Interpreter Pattern) — это паттерн проектирования, который определяет, как оценивать предложения в языке. Основная идея заключается в создании класса для каждого символа (терминального или нетерминального) в специализированном компьютерном языке.

  • Принципы: Инструкции программы выполняются непосредственно, без предварительной конвертации в машинный код.
  • Преимущества: Проще в отладке и тестировании, большая гибкость.
  • Недостатки: Медленнее, чем скомпилированные языки, требует больше ресурсов.
  • Применение: Скриптовые языки, некоторые языки программирования высокого уровня.
  • Антипаттерны: Использование интерпретаторов в случаях, где производительность критически важна.

Паттерн «Переводчик»

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

Паттерн переводчика

9. Архитектурный стиль параллелизма
Параллелизм (Concurrency) — это свойство системы, в которой несколько независимых задач выполняются одновременно.

  • Принципы: Различные части программы выполняются независимо, потенциально одновременно.
  • Преимущества: Может значительно улучшить производительность, особенно на многопроцессорных системах.
  • Недостатки: Проектирование и устранение проблем с состоянием гонки (race conditions) и взаимной блокировкой (deadlocks) может быть сложным.
  • Применение: Системы реального времени, вычислительные системы с высокой производительностью, веб-серверы.
  • Антипаттерны: Пренебрежение возможными проблемами конкурентности и неправильная синхронизация общих ресурсов.

Паттерн Оркестрация (Orchestration Pattern)

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

Архитектурный стиль оркестрации

Паттерн «Хореография» (Choreography Pattern)

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

Архитектурный стиль хореографии

Паттерн «Главный-Вспомогательный»

(Primary-Secondary Pattern)

Этот паттерн состоит из двух типов компонентов: Главный (Primary) и Вспомогательный (Secondary). Главный компонент распределяет работу между одинаковыми вспомогательными компонентами и вычисляет окончательный результат на основе результатов, возвращаемых этими вспомогательными машинами. Этот паттерн используется в параллельных вычислениях для выполнения вычислений быстрее, путём деления огромной вычислительной задачи на несколько процессоров.
10. Архитектура ориентированная на данные
Этот стиль сфокусирован на том, как организуются и преобразовываются данные. Он часто используется в системах, которые обрабатывают большие объемы данных, выполняют сложные вычисления или требуют высокой масштабируемости.

  • Принципы: База данных находится в центре архитектуры и все взаимодействия происходят через базу данных.
  • Преимущества: Может обеспечить последовательность, целостность и надёжность данных.
  • Недостатки: Может создавать узкие места в работе с данными и потенциальные проблемы с масштабируемостью.
  • Применение: Множество корпоративных приложений, систем управления взаимоотношениями с клиентами (CRM) и систем управления предприятием (ERP).
  • Антипаттерны: Пренебрежение возможностью узких мест в работе с данными, не учитывающая масштабируемости данных.

Паттерн «Разделение моделей чтения и изменения» (Command Query Responsibility Segregation — CQRS)

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

Архитектурный паттерн «Команда или Запрос»

Паттерн летописи событий (Event Sourcing)

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

Паттерн «Kappa»

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

Паттерн «Лямбда» (Lambda)

Это архитектура обработки данных, разработанная для работы с огромными объемами данных с использованием методов пакетной и потоковой обработки. Он обеспечивает надёжную, устойчивую к сбоям систему относительно отказов оборудования и человеческих ошибок. Этот паттерн используется в задачах обработки больших данных.
Выводы
В заключение, понимание архитектурных стилей и паттернов является критически важным для любого архитектора программного обеспечения или разработчика. Эти стили и паттерны предоставляют способ общения, документирования и исследования альтернативных дизайнов. Они также предлагают решения для общих проблем, экономя время и усилия и приводя к более надёжным и поддерживаемым системам.
В этом блоге мы исследовали различные архитектурные стили и паттерны, каждый из которых обладает своими сильными и слабыми сторонами и оптимальными областями применения. Однако это лишь вершина айсберга. Существует еще множество стилей и паттернов, и постоянно разрабатываются новые.