Слои и уровни

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

Чтобы говорить на одном языке, обозначим термины.

Пользователь — человек или приложение, использующие продукт в своих целях.

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

Слой — неотъемлемая часть приложения (продукта) находящегося на определенном уровне (на определенной глубине).

Уровень — глубина, на которой находится слой (глубины стека вызовов).

Заметки: 

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

Давайте рассмотрим пример разделения продукта на три слоя (образующих три уровня):

Архитектура приложения в репозитории

Если выше указанные части приложения не объедены, то у нас получится три слоя. Часто на практике каждый слой это отдельное приложение:

  1. frontend app
  2. backend app
  3. database app

Правильное отображение слоев:

Неправильное отображение слоев:

Монолит и слои

Укрупнение — связывание слоев в единое приложение. Считается плохой практикой, и на то есть причины:

  • слои могут быть написаны на разных языках программирования и могут иметь свою инфраструктуру
  • разделив на слои, приложение становится удобнее понимать и следовательно поддерживать
  • каждый слой может быть потенциально запущен на отдельном компьютере (или кластере)
  • изменения в одном слое не влияют на другие слои (если они независимы)
  • если слои независимы, задачи разработки могут быть распределены на несколько команд или разработчиков и поэтому могут быть реализованы быстрее (слои можно разрабатывать/обслуживать параллельно). Пример по изображению выше: web дизайнер с frontend-разработчиком делают приложение для человека, backend-инженер (software engineer) реализует доменную логику для frontend-а, а администратор БД создает модель данных и заботится о высокой доступности данных.

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

Источники: 1


26.12.2010 11:19