Software Architectural Patterns

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

Что такое архитектурный шаблон?

По материалам Википедии,

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

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

1. Многоуровневый шаблон

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

Чаще всего в общих информационных системах встречаются следующие 4 слоя:

·        Слой представления (также известен как слой пользовательского интерфейса)

·        Слой приложения (также известен как слой сервиса)

·        Слой бизнес-логики (также известен как уровень предметной области)

·        Слой доступа к данным (также известен как уровень хранения данных)

Использование

·        Общие десктопные приложения.

·        Веб-приложения e-commerce.

Многоуровневый шаблон
Многоуровневый шаблон

2. Клиент-серверный шаблон

Данный шаблон состоит из двух частей: сервера и множества клиентов. Серверный компонент предоставляет службы клиентским компонентам. Клиенты запрашивают услуги у сервера, а он, в свою очередь, оказывает эти самые услуги клиентам. Более того, сервер продолжает «подслушивать» клиентские запросы.

Использование

·        Онлайн приложения (электронная почта, совместный доступ к документам, банковские услуги).

Шаблон «Клиент-сервер»
Шаблон «Клиент-сервер»

3. Ведущий-ведомый

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

Использование

·        В репликации баз данных. Там главная БД считается авторитетным источником, а подчиненные базы с ней синхронизируются.

·        Периферийные устройства, подключенные к шине в компьютере (ведущие и ведомые устройства).

Шаблон «Ведущий-ведомый»
Шаблон «Ведущий-ведомый»

4. Каналы и фильтры

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

Использование

·        Компиляторы. Последовательные фильтры выполняют лексический, синтаксический, семантический анализ и создание кода.

·        Рабочие процессы в биоинформатике.

Шаблон «Каналы и фильтры»
Шаблон «Каналы и фильтры»

5. Шаблон посредника

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

Сервер размещает свои возможности (службы и характеристики) у посредника (брокера). Клиент запрашивает услугу у брокера. Затем брокер перенаправляет клиента к подходящей службе из своего реестра.

Использование

·        Брокеры сообщений по типу Apache ActiveMQApache KafkaRabbitMQ и  JBoss Messaging.

Шаблон «Посредник»
Шаблон «Посредник»

6. Одноранговый шаблон

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

Использование

·        Файлообменные сети (Gnutella и G2)

·        Мультимедийные протоколы (P2PTV и PDTP)

·        Проприетарные мультимедийные приложения (как тот же Spotify).

Одноранговый шаблон
Одноранговый шаблон

7. Шина событий

Этот шаблон, в основном, взаимодействует с событиями и состоит из 4 главных компонентов: источник события, прослушиватель события, канал и шина событий. Источники размещают сообщения для определенных каналов на шине событий. Прослушиватели подписываются на определенные каналы. Прослушиватели получают уведомления о появлении сообщений, размещенных на каналах из их подписки.

Использование

·        Разработки на Android

·        Сервисы уведомлений

Шаблон «Шина событий»
Шаблон «Шина событий»

8. Модель-представление-контроллер

Этот шаблон также известен как MVC-шаблон. Он разделяет интерактивные прикладные программы на 3 части:

1.    модель — содержит ключевые данные и функционал;

2.  представление — показывает информацию пользователю (можно задавать более одного представления);

3.  контроллер — занимается обработкой данных от пользователя.

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

Использование

·        Архитектура WWW-приложений, написанных на основных языках программирования.

·        Веб-фреймворки (например, Django и Rails)

Шаблон «Модель-представление-контроллер»
Шаблон «Модель-представление-контроллер»

9. Доска

Такой шаблон подходит для проблем, для которых отсутствуют четкие детерминированные решения. Шаблон «Доска» состоит из 3 главных компонентов:

·        доска — это структурированная глобальная память, содержащая объекты из пространства возможных решений;

·        источник знания — специализированные модули со своим собственным представлением;

·        компоненты управления — выбирает, настраивает и исполняет модули.

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

Использование

·        распознавание речи;

·        идентификация и отслеживание транспортных средств;

·        определение структур белка;

·        интерпретация сигналов Sonar.

Шаблон «Доска»
Шаблон «Доска»

10. Интерпретатор

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

Использование

·        языки запросов к базе данных (SQL);

·        языки, которые используются для описания протоколов передачи данных.

Шаблон «Интерпретатор»
Шаблон «Интерпретатор»

Сравнение архитектурных шаблонов

Ниже приводятся плюсы и минусы каждого из архитектурных шаблонов.

Сравнение архитектурных шаблонов
Сравнение архитектурных шаблонов

Многоуровневый шаблон

Плюсы:

  • Одним низким слоем могут пользоваться разные слои более высокого ранга.
  • Слои упрощают стандартизацию, т.к. мы четко определяем уровни.
  • Изменения вносятся внутри какого-то одного слоя, при этом остальные слои остаются неизменными.

Минусы:

  • Не универсален.
  • В ряде ситуаций возможен пропуск некоторых слоев.

Клиент-серверный шаблон

Плюсы:

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

Минусы:

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

Шаблон «Ведущий-ведомый»

Плюсы:

  • Точность, т.к. выполнение службы делегируется разным ведомым с разной реализацией.

Минусы:

  • Все ведомые изолированы, у них отсутствует общее состояние.
  • Период ожидания в коммуникации «ведущий-ведомый» – это значительный минус. Например, в системах реального времени.
  • Подходит только для тех проблем, решение которых можно разложить на части.

Шаблон «Каналы и фильтры»

Плюсы:

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

Минусы:

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

Шаблон «Посредник»

Плюсы:

  • Возможно динамическое изменение, добавление, удаление и перемещение объектов. Этот шаблон делает процесс распределения прозрачным для разработчика.

Минусы:

  • Необходима стандартизация описаний служб.

Одноранговый шаблон

Плюсы:

  • Поддерживает децентрализованные вычисления. Крайне устойчив к сбоям в любом узле.
  • Высокая масштабируемость по части ресурсной и вычислительной мощности.

Минусы:

  • Отсутствует гарантия качества служб, т.к. узлы кооперируются стихийно.
  • Трудно гарантировать защищенность.
  • Производительность зависит от количества узлов.

Шаблон «Шина событий»

Плюсы:

  • Простое добавление новых подписчиков, издателей и связей. Хорошо зарекомендовал себя для сильно распределенных приложений.

Минусы:

  • Проблема с масштабируемостью, т.к. все сообщения проходят через одну шину событий.

Шаблон «Модель-представление-контроллер»

Плюсы:

  • Упрощает создание различных представлений одной и той же модели; их можно включить или отключить на этапе выполнения.

Минусы:

  • Возрастает сложность алгоритма. Может привести ко многим ненужным корректировкам действий пользователей.

Шаблон «Доска»

Плюсы:

  • Легкое добавление новых приложений.
  • Можно без труда расширять структуры пространства данных.

Минусы:

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

Шаблон «Интерпретатор»

Плюсы:

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

Минусы:

  • Проблемы с производительностью, т.к. интерпретированный язык медленнее скомпилированного.

 

Перевод статьи Vijini Mallawaarachchi10 Common Software Architectural Patterns in a nutshell

Предыдущая статьяХудший враг программиста — долгосрочная актуальность
Следующая статьяJavascript и функциональное программирование. Часть 2: полноправные функции