Архитектура: Multitier

Multitier


Архитектура выполнена по принципу зависимых (детали ниже) слоев приложения. Каждый слой должен отвечать следующим двум обязательным параметрам:

  • нижестоящие слои не должны зависеть от вышестоящих;
  • каждый слой не должен быть осведомлен о вышестоящем, но должен предоставлять определенный набор открытых функций. Чем более стандартизированной и универсальной будет реализация, тем безболезнее будет выполняться замена слоя (при необходимости).

Плюсы

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

Минусы

  • чем больше слоев, тем сложнее сопровождать и развивать систему в целом;
  • горизонтальное масштабирование все так же сложнодостижимо (как и при монолитной архитектуре);
  • возможна деградация системы в связи с невозможностью замены одного или нескольких слоев аналогами - система становится похожа на анти-паттерн Big Ball of Mud.

История развитие

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

  • Первый этап. Приложения были больше похожи на монолитные. Как правило, имели только 2 слоя - консоль для передачи команд и бизнес-слой с логикой приложения;
  • Второй этап. Состоит уже из 3 слоев - UI (реализованный с использованием web, консоли, мобильного приложения или desktop интерфейса), бизнес-слоя с логикой приложения и источника данных (новый слой относительно первого этапа). На втором этапе приложения стали разделять на клиент-серверные части, что стало классической реализацией и по сей день.
  • Третий этап. Количество слоев осталось прежним, но наполнение слоев значительно усложнилось. В связи с бурной диджитализацией различных областей жизни человека, системам потребовалось расширение, а следовательно и усложнение. На данном этапе окончательно сформировалась трех-уровневая (three-tier, n-tier) архитектура. Важной особенностью стало четкое разделение слоев друг от друга и слабая связанность между ними.
  • Четвертый этап. На текущий момент, является самой совершенной реализацией многослойного приложения, а так же, наиболее часто применяемого для систем низкой и средней сложности. Ключевым источником идеи явлется Domain-Driven архитектура, которая выделяет 4 слоя приложения:
    • Слой интерфейсов - сюда можно отнести внешнюю оболочку, а так же интерфейсы для доступа к данным другим системам посредством стандартных (и не только) протоколов (например, HTTP);
    • Слой приложения - слой, принимающий запросы клиентов системы (людей или внешних систем) на выполнение тех или иных действий;
    • Слой бизнес-логики - слой, отвечающий за работу бизнес-логики приложения, сущности, обмен данных между сущностями, действия приложения над данными и объектами и т.д. Основной слой, выполняющий всю оперативную работу;
    • Инфраструктурный слой - вспомогательный слой, выполняющий задачи в зависимости от приложения, например, для хранения данных, отправки сообщений, взаимодействие с другими системами и т.д.

Архитектара

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

Многослойное приложение так же имеет риски для прихода к свойственному ей анти-паттерну:

  • Чрезмерный акцент на слоях. При реализации простой задачи, каждый слой должен быть задействован (в соответствии с иерархией) - это приводит к созданию ненужных прокси объектов, которые выполняют функцию лишь транспорта данных;
  • Чрезмерная абстракция. Изобилие абстракций приводит к большому количеству элементов языка, которые ничего не выполняют;
  • Слишком много ненужных слоев. Бывает что некоторые слои не нужны, но они все равно добавляются в связи с требованиями стандартов архитектуры;
  • Выделение слоев по их функциональному назначению (слой хранения, UI-слой, API-слой, бизнес-логика и т.д.), вместо организации в соответствии с компонентами приложения (продукт, заказ, доставка, и т.д.). Это приводит к тому что поддержке и развитию функциональных частей приложения уделяется больше внимания, чем самому продукту.

Литература

2002 – Martin Fowler – Patterns of Enterprise Application Architecture
2003 – Eric Evans – Domain-Driven Design: Tackling Complexity in the Heart of Software
2011 – Chris Ostrowski – Understanding Oracle SOA – Part 1 – Architecture

 Comments
Comment plugin failed to load
Loading comment plugin