Поработав в нескольких серьезных компаниях, я увидел что люди не видят разницу между уровнями и слоями приложения, давайте внесём ясность в этот вопрос.
Чтобы говорить на одном языке, обозначим термины.
Пользователь — человек или приложение, использующие продукт в своих целях.
Продукт — приложение удовлетворяющее возложенные на него обязанности (часто для удовлетворения нужд пользователя).
Слой — неотъемлемая часть приложения (продукта) находящегося на определенном уровне (на определенной глубине).
Уровень — глубина, на которой находится слой (глубины стека вызовов).
Заметки:
в определенном слое (или на определенном уровне) может рядом (параллельно) находится несколько приложений без который нельзя реализовать слой
в одном приложении могут быть реализованы несколько слоев (таким образом слой может иметь сразу несколько уровней, но никогда количество уровней не будет меньше количества слоев)
приложение реализовавшее несколько слоев (по сути скрывая их внутри себя), рассматривают в рамках одного слоя (таким образом кол-во уровней не увеличивается)
Давайте рассмотрим пример разделения продукта на три слоя (образующих три уровня):
Если выше указанные части приложения не объедены, то у нас получится три слоя. Часто на практике каждый слой это отдельное приложение:
frontend app
backend app
database app
Правильное отображение слоев:
Неправильное отображение слоев:
Монолит и слои
Укрупнение — связывание слоев в единое приложение. Считается плохой практикой, и на то есть причины:
слои могут быть написаны на разных языках программирования и могут иметь свою инфраструктуру
разделив на слои, приложение становится удобнее понимать и следовательно поддерживать
каждый слой может быть потенциально запущен на отдельном компьютере (или кластере)
изменения в одном слое не влияют на другие слои (если они независимы)
если слои независимы, задачи разработки могут быть распределены на несколько команд или разработчиков и поэтому могут быть реализованы быстрее (слои можно разрабатывать/обслуживать параллельно). Пример по изображению выше: web дизайнер с frontend-разработчиком делают приложение для человека, backend-инженер (software engineer) реализует доменную логику для frontend-а, а администратор БД создает модель данных и заботится о высокой доступности данных.
Хорошая архитектура позволит создать монолитную систему, развертываемую как один файл, а затем превратить ее в набор независимых единиц развертывания и далее в независимые службы и/или микрослужбы. Позднее, если необходимо, архитектура должна позволить обратить все вспять и вновь вернуться к монолитной структуре.