Снова всем Здравствуйте!
Я продолжаю "бороться" с архитектурой приложения.
Суть архитектуры приложения в целом понятна — надо разделить приложение на логические слои:
— UI — пользовательский интерфейс,
— Model — модель, бизнес-логика, бизнес-слой,
— Infrastructure — это все низкоуровневые детали типа базы данных и т.д.
А вот многие детали реализации архитектуры мне непонятны в связи с недостатком опыта.
Возник следующий вопрос.
Кроме деления приложения на "логические" слои, приложение делится еще и на "физические" уровни.
Уровень, грубо говоря, — это физический компьютер, на котором выполняется программный код.
"Уровень" — это возможно не совсем точный термин.
Но вот в этой статье от Microsoft применяется именно термин "уровень":
https://learn.microsoft.com/ru-ru/azure/architecture/guide/architecture-styles/n-tier
В случае когда каждому логическому слою приложения соответствует "свой" физический уровень, это разделение как бы "естественное".
В этом случае граница между слоями совпадает с границей между уровнями, по сути это одна и та же "граница", которая реализуется через адаптеры инфраструктуры.
Получается, что дизайн и реализация взаимодействия и слоев и уровней через эти границы — совпадают.
Но возможен и другой случай, когда один логический слой разделяется на два физических уровня.
Например, слой бизнес-логики должен быть расположен на двух серверах (на двух разных физических ПК).
В этом случае одна часть бизнес-логики (на первом ПК) взаимодействует с другой частью бизнес-логики (на втором ПК).
Получается, что здесь появляется дополнительная граница между уровнями
внутри одного слоя.
Как это реализуется?
Как построить правильную архитектуру (правильный дизайн) такого разделения слоя?
Тут проблема в следующем.
Объекты слоя бизнес-логики должны обращаться только к другим объектам бизнес-логики. Они не должны ничего знать про инфраструктуру. Однако, чтобы "связать" две части бизнес-логики, расположенные на разных ПК (на разных уровнях), нужно использовать низкоуровневое взаимодействие через сеть.
Получается, что если один объект BusinessObject1, расположенный на ПК-1, хочет создать экземпляр BusinessObject2, который реализован на ПК-2, то BusinessObject1 просто вынужден "знать" про инфраструктуру, чтобы запросить через сеть (например, через REST-запрос) у другого ПК экземпляр BusinessObject2.
Как-то это неправильно. Или я чего-то не понимаю.
Объясните, пожалуйста, как это делается?
Интересует хотя бы примерная схема\дизайн решения такого взаимодействия "внутри" одного слоя через сеть.