Бизнес-логика действительно принадлежит серверу?


10

Типичным стеком для веб-приложения является база данных, сервер с серверным кодом и пользователь с браузером с HTML / CSS / JavaScript.

До обширного AJAX, MVC, в котором контроллером был код на стороне сервера. Сервер должен был направлять запросы ответов для динамических веб-страниц (то есть шаблонные html-решения, такие как JSP и ASP). Сервер координирует вызовы к базе данных и решает, какую динамическую страницу использовать для ответа на запрос страницы. Результатом всего этого является то, что сервер содержит бизнес-логику, хотя бизнес-логика не сильно связана с идеей обслуживания страниц.

Теперь, когда мы переходим на «Web 2.0», сервер обслуживает статические страницы, которые используют JavaScript, чтобы заполнить себя и изменить то, что они представляют. Может быть в JavaScript. JavaScript часто реализует службу RESTful, что означает, что он задает запрос к базе данных.

Таким образом, серверу оставлены роли обслуживать реальные файлы и отвечать на вызовы AJAX. Ответ на вызовы AJAX - это просто управление сеансом и обеспечение безопасности. И действительно, что даже должен видеть пользователь, это данные, которые должны быть указаны в базе данных.

Таким образом, следует ли отнести сервер на роль тупого посредника, который лишь изредка отправляет электронное письмо или запускает веб-сервис? Может ли бизнес-логика жить в JavaScript (если она не является секретной) или в хранимых процедурах, когда она есть?

Имеет ли смысл даже объединять серверы и базы данных или заставить ERP-решения, такие как SAP, функционировать в качестве серверов?

Ответы:


14

Из соображений безопасности бизнес-логика почти всегда должна выполняться на сервере, которым вы управляете. Если под «сервером» вы подразумеваете «веб-сервер», то я согласен, что для этого не требуется почти никакой бизнес-логики. Но вам почти всегда нужен сервер приложений с бизнес-логикой, находится ли он внутри базы данных или веб-сервера или является отдельным и вызывается веб-сервером.

Существуют приложения реального мира, в которых веб-сервер не делает ничего, кроме предоставления API сервера приложений через веб-службы или JSON.

Даже до Web 2.0 и AJAX действительно не считалось лучшей практикой смешивать вашу бизнес-логику со страницами ASP. Считалось, что лучше иметь независимую бизнес-логику и иметь серверную часть логики представления в ASP, JSP или где-либо еще. Таким образом, реальное отличие от веб 2.0 состоит в том, что уровень представления может быть полностью в javascript. Я предпочитаю это лично.


Ну да, я согласен, бизнес-логика не должна быть в ASP. В этом смысл MVC.
Джо

Это ответ почти два года назад, и теперь такие вещи, как SproutCore, в моде. На веб-сайте SproutCore они прямо заявляют, что цель состоит в том, чтобы перенести бизнес-логику в браузер (см. Sproutcore.com/about ). Итак ... изменилось ли сейчас состояние сети? Бизнес-логика на клиенте (в частности, через JS в браузере) нормальна или даже предпочтительнее?
JoeCool

@JoeCool SproutCore тогда существовал. А соображения безопасности при наложении бизнес-логики на клиента не изменились. Но не у всех приложений есть много проблем безопасности. Кроме того, "весь гнев" кажется довольно завышенным для SproutCore. Но возможность делать больше на клиенте продолжала увеличиваться - за исключением того, что мобильные устройства продолжали набирать популярность, и они остаются сложными с точки зрения производительности для многих приложений.
PSR

@psr Конечно, но вы, похоже, полностью отмахнулись от использования бизнес-логики в клиенте, хотя на самом деле, по крайней мере, несколько популярных технологий сегодня явно движутся в этом направлении.
JoeCool

6

JavaScript часто реализует службу RESTful, что означает, что он задает запрос к базе данных.

Это где вы ошиблись. Отдых не CRUD.

Ресурсы, предоставляемые REST, не являются записями вашей базы данных; это полностью управляемые объекты, которые ведут себя в соответствии с вашей бизнес-логикой. Когда сервер получает POST или PUT, он не должен просто проверять и хранить. Он должен выполнять все, что подходит для приложения.

Простой пример: приложение, похожее на твиттер, получает твиты в виде сообщений POST для данного контейнера. Затем сервер анализирует контекст («кто вы?», «Какой это канал?») И контент («любые хэштеги?», Текстовые индексы и т. Д.) И сохраняет все это в соответствующих очередях. Вероятно, добавляет ссылку непосредственно на всех ваших последователей.

Это большая работа, помимо простого добавления ресурса в контейнер, все это определяется вашей бизнес-логикой. И это относится к серверу.


2

Мои проблемы с этим подходом могут быть связаны с неправильным пониманием вашего дизайна, поэтому, пожалуйста, не стесняйтесь меня застрелить.

однако подумайте о масштабируемости, обслуживании и безопасности продукта.

Если ваш продукт значительно расширяется, база данных становится узким местом, поэтому, хотя «производительность» предполагает использование бизнес-логики в хранимых процедурах, это увеличивает нагрузку на процессор на сервере базы данных, продвигая день, когда сервер достигает максимальной емкости. В отличие от веб-серверов, базы данных ACID не легко масштабируются при использовании параллельного оборудования. Если ваш продукт никогда не будет таким успешным, это не проблема.

Мысль о поддержании бизнес-логики в javascript, работающем на веб-браузерах, где разные браузеры будут требовать разные javascriopt, несколько версий браузеров и т. Д. ... Почему эта проблема усложняется, чем она уже есть?

Однако, как сказал Javiar, использование подхода REST в качестве API базы данных для вашего продукта действительно нецелесообразно. Преимущество интерфейса REST заключается в том, что другие люди будут думать о различных способах использования и запроса вашего интерфейса REST. Однако это общедоступные ресурсы после бизнес-логики, а не ресурсы записей низкоуровневых таблиц. Мысль о создании таких низкоуровневых запросов данных через HTTP API звучит как кошмар безопасности.


+1, за подкуп проблемы совместимости браузера. Кроме того, написание бизнес-кода на JavaScript требует дополнительных навыков и не позволяет использовать методы в ваших бизнес-классах.
NoChance

2

Несмотря на то, что существует множество точек зрения на это, и, конечно, ни один из способов не может быть универсально назван «правильным путем», в то время как все остальные универсально являются «неправильным путем», существует ряд причин для изоляции бизнес-логики на стороне сервера. и получить доступ к этим объектам и услугам через службу RESTful.

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

В деталях:

Первостепенной причиной номер 1 является безопасность. Клиентам никогда не следует доверять отправку чего-либо, кроме мусора, на сервер, и, сохраняя аспекты безопасности на стороне сервера, вы изолируете потенциальный риск того, что мошенник повредит вашу систему. Помните, Javascript полностью на стороне клиента и легко меняется, поэтому вы НЕ МОЖЕТЕ ДОВЕРЯТЬ ВЫХОДУ.

Причиной номер 2 является разделение интересов. Ваш программист javascript может не быть экспертом по безопасности, и ваш гуру безопасности может быть не так хорош в Javascript. Отделяя бизнес-логику от логики представления, вы избегаете пересечения этих проблем, поскольку javascript не будет разрешен доступ к ресурсам, превышающим его уровни разрешений, и будут возникать ошибки, обработка которых находится в пределах досягаемости Script Programmer. Точно так же парень по безопасности не будет отлаживать Javascript, чтобы посмотреть, как поддерживается безопасность.

Причина номер 3 - производительность. Бизнес-логика потенциально может требовать ресурсов сервера и базы данных. Сохраняя эту логику изолированной от ваших элементов пользовательского интерфейса, вы можете затем масштабировать только ту часть вашего приложения, что значительно облегчает устранение узких мест. Кроме того, гораздо проще определить, какой бизнес-процесс загружает вашу систему или базу данных, если бизнес-процессы выполняются на сервере.

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

Наконец, я хотел бы предложить, чтобы для поддержания стандартов ACID Business Logic действительно была на сервере. Я помню, как обслуживал биллинговый продукт, который запускался в веб-браузере, только с подключением базы данных к серверу. Если ежедневное выставление счетов (которое может занять час или более в хороший день!) Было прервано, скажем, из-за закрытия или сбоя браузера, это может занять несколько часов, чтобы разобраться в беспорядке в базе данных, которая была оставлена в противоречивом состоянии. Помните, что это также касалось кредитных карт, поэтому записи счетов тоже нужно было проверять на процессор!

Бизнес-логика на стороне сервера в основном тривиальна для обеспечения обновлений ACID, так как существуют какие-либо платформы для любого языка для поддержки транзакций на уровне приложения или базы данных. Если вы делаете это с помощью нескольких обновлений из веб-клиента ... в какой-то момент вы получите несовместимое состояние, и это, вероятно, повлияет на ваше приложение.

Хотя может показаться заманчивым, что сервисы RESTful представляют собой просто способ доступа к базе данных, вы не должны попадать в эту ловушку, поскольку это хороший рецепт для катастрофы. Объектная модель, которую вы предоставляете через службу RESTful, может быть связана с вашей базой данных, но должна действительно инкапсулировать вашу бизнес-логику, а не просто использовать ее в качестве механизма CRUD.


+1 за поднятие многих хороших очков. Система биллинга, которую вы использовали в качестве примера, имеет самый странный дизайн, о котором я когда-либо слышал.
NoChance

У него было самое странное имя, о котором я когда-либо слышал, хотя я все еще вижу ссылки на него. Он назывался HURLnet ISP Admin, и его было довольно сложно поддерживать. У нас была лицензия на полный исходный код, и я широко использовал ее, когда они перестали ее поддерживать.
SplinterReality
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.