Как и многие архитектурные вопросы, это может быть уравновешивающим действием.
Конечно, одно из преимуществ трехуровневого веб-приложения, состоящего в том, что каждый уровень размещается на отдельных машинах, заключается в том, что теперь вы можете потенциально распределять нагрузку по отдельности между различными частями приложения. Например, у вас может быть 3 веб-сервера, обслуживающих только графический интерфейс пользователя, этот «кластер» будет подключаться к «кластеру» из 3 серверов приложений, все из которых прекрасно сбалансированы по нагрузке и рассматриваются как один «экземпляр» для веб-серверов. Аналогично, аналогичная ситуация с DAL (уровень доступа к данным).
Разделение уровней таким способом также позволяет на определенном уровне «разъединять» слои общего приложения. Это позволяет настраивать каждый уровень по-разному (т. Е. Может использовать другое оборудование или другую ОС и т. Д.), И, пока интерфейс остается согласованным, не должно быть проблем, если какой-либо из отдельных уровней будет изменен.
Это неизменно будет влиять на разработку программного обеспечения, поскольку DAL / BLL / UI теперь будет представлять собой отдельные сборки (вероятно, отдельно скомпилированные библиотеки DLL или эквивалентные) и действительно отдельные уровни , а не просто структурировать код в отдельные слои внутри одного приложения / проекта.
В прошлом я представлял бизнес-уровень веб-приложения как веб-сервис, и веб-интерфейс был полностью написан для этого сервиса. Это позволило компании продавать продукт в виде размещенного в сети веб-решения, которое клиенты могли бы использовать, одновременно продавая доступ к тому же продукту, что и веб-сервис, что позволило клиентам интегрировать функциональные возможности продукта в свои внутренние приложения (например, вертикальный рынок). раствор).
Конечно, есть баланс. Разделение уровней на отдельные машины внесет некоторую сложность в общую архитектуру системы. Вы правильно указываете на пару потенциальных проблем, таких как трафик между машинами, который теперь добавит некоторый уровень издержек, которых не было бы, если бы уровни связи были на одной машине. Также существует сортировка данных между каждым уровнем, что также увеличивает накладные расходы. Разумеется, в случае веб-службы сериализация и десериализация сложных объектов может привести к значительным накладным расходам и негативно повлиять на производительность, особенно при очень интенсивном трафике.
В зависимости от того, что в действительности подвергается пользователям всего приложения, безопасность на «нижних» уровнях может или не может требоваться. Если вы открываете только веб-интерфейс, нижние уровни должны быть настроены как недоступные (кроме как через веб-сервер), однако, если вы выставляете «бизнес-уровень», а также уровень веб-интерфейса, вы будете у вас есть дополнительное бремя защиты "потенциальных" областей атаки вашего приложения.
В конечном счете, тем не менее, если вы знаете, что вам не нужно балансировать нагрузку на отдельные уровни, и вы знаете, что вам не нужно переключать один уровень или предоставлять бизнес-логику отдельно от веб-интерфейса пользователя. , это может быть больше усилий, чем стоит.