Типичным стеком для веб-приложения является база данных, сервер с серверным кодом и пользователь с браузером с HTML / CSS / JavaScript.
До обширного AJAX, MVC, в котором контроллером был код на стороне сервера. Сервер должен был направлять запросы ответов для динамических веб-страниц (то есть шаблонные html-решения, такие как JSP и ASP). Сервер координирует вызовы к базе данных и решает, какую динамическую страницу использовать для ответа на запрос страницы. Результатом всего этого является то, что сервер содержит бизнес-логику, хотя бизнес-логика не сильно связана с идеей обслуживания страниц.
Теперь, когда мы переходим на «Web 2.0», сервер обслуживает статические страницы, которые используют JavaScript, чтобы заполнить себя и изменить то, что они представляют. Может быть в JavaScript. JavaScript часто реализует службу RESTful, что означает, что он задает запрос к базе данных.
Таким образом, серверу оставлены роли обслуживать реальные файлы и отвечать на вызовы AJAX. Ответ на вызовы AJAX - это просто управление сеансом и обеспечение безопасности. И действительно, что даже должен видеть пользователь, это данные, которые должны быть указаны в базе данных.
Таким образом, следует ли отнести сервер на роль тупого посредника, который лишь изредка отправляет электронное письмо или запускает веб-сервис? Может ли бизнес-логика жить в JavaScript (если она не является секретной) или в хранимых процедурах, когда она есть?
Имеет ли смысл даже объединять серверы и базы данных или заставить ERP-решения, такие как SAP, функционировать в качестве серверов?
Это где вы ошиблись. Отдых не CRUD.
Ресурсы, предоставляемые REST, не являются записями вашей базы данных; это полностью управляемые объекты, которые ведут себя в соответствии с вашей бизнес-логикой. Когда сервер получает POST или PUT, он не должен просто проверять и хранить. Он должен выполнять все, что подходит для приложения.
Простой пример: приложение, похожее на твиттер, получает твиты в виде сообщений POST для данного контейнера. Затем сервер анализирует контекст («кто вы?», «Какой это канал?») И контент («любые хэштеги?», Текстовые индексы и т. Д.) И сохраняет все это в соответствующих очередях. Вероятно, добавляет ссылку непосредственно на всех ваших последователей.
Это большая работа, помимо простого добавления ресурса в контейнер, все это определяется вашей бизнес-логикой. И это относится к серверу.
источник
Мои проблемы с этим подходом могут быть связаны с неправильным пониманием вашего дизайна, поэтому, пожалуйста, не стесняйтесь меня застрелить.
однако подумайте о масштабируемости, обслуживании и безопасности продукта.
Если ваш продукт значительно расширяется, база данных становится узким местом, поэтому, хотя «производительность» предполагает использование бизнес-логики в хранимых процедурах, это увеличивает нагрузку на процессор на сервере базы данных, продвигая день, когда сервер достигает максимальной емкости. В отличие от веб-серверов, базы данных ACID не легко масштабируются при использовании параллельного оборудования. Если ваш продукт никогда не будет таким успешным, это не проблема.
Мысль о поддержании бизнес-логики в javascript, работающем на веб-браузерах, где разные браузеры будут требовать разные javascriopt, несколько версий браузеров и т. Д. ... Почему эта проблема усложняется, чем она уже есть?
Однако, как сказал Javiar, использование подхода REST в качестве API базы данных для вашего продукта действительно нецелесообразно. Преимущество интерфейса REST заключается в том, что другие люди будут думать о различных способах использования и запроса вашего интерфейса REST. Однако это общедоступные ресурсы после бизнес-логики, а не ресурсы записей низкоуровневых таблиц. Мысль о создании таких низкоуровневых запросов данных через HTTP API звучит как кошмар безопасности.
источник
Несмотря на то, что существует множество точек зрения на это, и, конечно, ни один из способов не может быть универсально назван «правильным путем», в то время как все остальные универсально являются «неправильным путем», существует ряд причин для изоляции бизнес-логики на стороне сервера. и получить доступ к этим объектам и услугам через службу RESTful.
Короткий ответ заключается в том, что в основном речь идет об управлении рисками, а также о мониторинге и улучшении производительности.
В деталях:
Первостепенной причиной номер 1 является безопасность. Клиентам никогда не следует доверять отправку чего-либо, кроме мусора, на сервер, и, сохраняя аспекты безопасности на стороне сервера, вы изолируете потенциальный риск того, что мошенник повредит вашу систему. Помните, Javascript полностью на стороне клиента и легко меняется, поэтому вы НЕ МОЖЕТЕ ДОВЕРЯТЬ ВЫХОДУ.
Причиной номер 2 является разделение интересов. Ваш программист javascript может не быть экспертом по безопасности, и ваш гуру безопасности может быть не так хорош в Javascript. Отделяя бизнес-логику от логики представления, вы избегаете пересечения этих проблем, поскольку javascript не будет разрешен доступ к ресурсам, превышающим его уровни разрешений, и будут возникать ошибки, обработка которых находится в пределах досягаемости Script Programmer. Точно так же парень по безопасности не будет отлаживать Javascript, чтобы посмотреть, как поддерживается безопасность.
Причина номер 3 - производительность. Бизнес-логика потенциально может требовать ресурсов сервера и базы данных. Сохраняя эту логику изолированной от ваших элементов пользовательского интерфейса, вы можете затем масштабировать только ту часть вашего приложения, что значительно облегчает устранение узких мест. Кроме того, гораздо проще определить, какой бизнес-процесс загружает вашу систему или базу данных, если бизнес-процессы выполняются на сервере.
Следствием этого является то, что часто несколько бизнес-процессов будут использовать одни и те же данные, и поэтому вы можете внедрить кэширование на стороне сервера, чтобы снизить общую нагрузку на систему, которая может быть невозможна / безопасна для предоставления доступа к коду на стороне клиента.
Наконец, я хотел бы предложить, чтобы для поддержания стандартов ACID Business Logic действительно была на сервере. Я помню, как обслуживал биллинговый продукт, который запускался в веб-браузере, только с подключением базы данных к серверу. Если ежедневное выставление счетов (которое может занять час или более в хороший день!) Было прервано, скажем, из-за закрытия или сбоя браузера, это может занять несколько часов, чтобы разобраться в беспорядке в базе данных, которая была оставлена в противоречивом состоянии. Помните, что это также касалось кредитных карт, поэтому записи счетов тоже нужно было проверять на процессор!
Бизнес-логика на стороне сервера в основном тривиальна для обеспечения обновлений ACID, так как существуют какие-либо платформы для любого языка для поддержки транзакций на уровне приложения или базы данных. Если вы делаете это с помощью нескольких обновлений из веб-клиента ... в какой-то момент вы получите несовместимое состояние, и это, вероятно, повлияет на ваше приложение.
Хотя может показаться заманчивым, что сервисы RESTful представляют собой просто способ доступа к базе данных, вы не должны попадать в эту ловушку, поскольку это хороший рецепт для катастрофы. Объектная модель, которую вы предоставляете через службу RESTful, может быть связана с вашей базой данных, но должна действительно инкапсулировать вашу бизнес-логику, а не просто использовать ее в качестве механизма CRUD.
источник