¿La lógica empresarial realmente pertenece al servidor?


10

Una pila típica para una aplicación web es una base de datos, un servidor con código del lado del servidor y un usuario con un navegador con HTML / CSS / JavaScript.

Antes del extenso AJAX, MVC en el que el controlador era el código del lado del servidor gobernó. Un servidor tenía que enrutar las solicitudes de respuesta para páginas web dinámicas (es decir, soluciones html con plantillas como JSP y ASP). El servidor coordinará las llamadas a la base de datos y decidirá qué página dinámica usar para responder la solicitud de la página. El resultado de todo esto es que el servidor terminó conteniendo la lógica empresarial, a pesar de que la lógica empresarial no está fuertemente ligada a la idea de servir páginas.

Ahora que nos estamos moviendo a "Web 2.0", un servidor sirve páginas estáticas que usan JavaScript para rellenarse y cambiar lo que están presentando. El puede estar en el JavaScript. El JavaScript a menudo implementa un servicio RESTful, lo que significa que está especificando la consulta de la base de datos.

Por lo tanto, el servidor tiene la función de servir archivos reales y responder llamadas AJAX. Y responder llamadas AJAX es meramente gestión de sesión y proporcionar seguridad. Y realmente, lo que un usuario debería poder ver es información que debería especificarse en la base de datos.

Entonces, a partir de ahí, ¿debería relegarse el servidor a la función de un intermediario tonto que solo ocasionalmente hace algo como enviar un correo electrónico o disparar un servicio web? ¿Podría la lógica de negocios vivir en JavaScript (cuando no es secreto) o en procedimientos almacenados cuando lo está?

¿Tendrá sentido incluso combinar servidores y bases de datos o hacer que las soluciones ERP como SAP funcionen como servidores?

Respuestas:


14

La lógica empresarial casi siempre tiene que ejecutarse en un servidor que controlas, por razones de seguridad. Si por "servidor" te refieres a "servidor web", entonces estoy de acuerdo, no necesita tener casi ninguna lógica de negocios. Pero casi siempre necesita un servidor de aplicaciones con la lógica empresarial, ya sea que esté dentro de una base de datos o un servidor web o que esté separado y llamado por el servidor web.

Hay aplicaciones del mundo real en las que el servidor web no hace más que exponer la API del servidor de aplicaciones a través de servicios web o JSON.

Incluso antes de Web 2.0 y AJAX, realmente no se consideraba una buena práctica mezclar la lógica de su negocio con las páginas ASP. Se consideró mejor tener una lógica empresarial independiente y que la porción del servidor de la lógica de presentación esté en ASP, JSP o lo que sea. Entonces, el cambio real desde la web 2.0 es que la capa de presentación puede estar completamente en JavaScript. Prefiero eso, personalmente.


Bueno, sí, estoy de acuerdo en que la lógica de negocios no debería estar en una ASP. Ese es el punto de MVC.
Joe

Esta respuesta es de hace casi dos años, y ahora cosas como SproutCore están de moda. En el sitio web de SproutCore, declaran explícitamente que el objetivo es mover la lógica de negocios al navegador (ver: sproutcore.com/about ). Entonces ... ¿ha cambiado el estado de la web ahora? ¿La lógica de negocios en el cliente (a través de JS en el navegador en particular) es correcta o incluso preferible?
JoeCool

@JoeCool SproutCore existía entonces. Y las consideraciones de seguridad de poner la lógica empresarial en el cliente no han cambiado. Pero no todas las aplicaciones tienen muchos problemas de seguridad. Además, "toda la rabia" parece bastante exagerado para SproutCore. Pero la viabilidad de hacer más en el cliente ha seguido aumentando, excepto que los dispositivos móviles han seguido ganando protagonismo y siguen siendo un desafío en cuanto al rendimiento para muchas aplicaciones.
psr

@psr Concedido, pero parecía que simplemente ignoraba el uso de la lógica empresarial en el cliente, cuando de hecho al menos algunas tecnologías populares hoy en día se dirigen claramente en esa dirección.
JoeCool

6

El JavaScript a menudo implementa un servicio RESTful, lo que significa que está especificando la consulta de la base de datos.

Aquí es donde te equivocaste. REST no es CRUDO.

Los recursos expuestos por REST no son los registros de su base de datos; son objetos completamente administrados que se comportan de acuerdo con la lógica de su negocio. Cuando el servidor recibe una POST o PUT, no solo debe validar y almacenar. Tiene que realizar cualquier cosa que sea apropiada para la aplicación.

Ejemplo simple: una aplicación similar a Twitter recibe tweets como mensajes POST en un contenedor determinado. Luego, el servidor analiza el contexto ("¿quién eres?", "¿Qué canal es este?") Y el contenido ("¿algún hashtags?", Índices de texto, etc.) y almacena todo esto en las colas respectivas. Probablemente agrega una referencia directamente a todos tus seguidores.

Eso es mucho trabajo más allá de simplemente agregar el recurso al contenedor, todo está definido por la lógica de su negocio. Y pertenece al servidor.


2

Mis preocupaciones con este enfoque pueden deberse a un malentendido de su diseño, así que siéntase libre de derribarme.

sin embargo, piense en la escalabilidad, capacidad de mantenimiento y seguridad del producto.

Si su producto crece de forma masiva, la base de datos se convierte en el cuello de botella, por lo que si bien el "rendimiento" sugiere poner la lógica empresarial en los procedimientos almacenados, pone una carga de CPU adicional en el servidor de la base de datos, adelantando el día en que el servidor alcance la capacidad máxima. A diferencia de los servidores web, las bases de datos ACID no se escalan fácilmente mediante el uso de hardware paralelo. Si su producto nunca será tan exitoso, esto no es un problema.

La idea de mantener la lógica de negocios en JavaScript que se ejecuta en webbrowswers, donde diferentes navegadores requerirán diferentes javascriopt, múltiples versiones de navegadores, etc. ¿Por qué hacer este problema más complicado de lo que ya es?

Sin embargo, como ha dicho Javiar, el uso de un enfoque REST como API de base de datos para su producto realmente no es sensato. Una de las ventajas de una interfaz REST es que otras personas pensarán en diferentes formas de usar y consultar su interfaz REST. Sin embargo, se trata de recursos públicos de lógica empresarial y no de recursos de registro de tabla de bajo nivel. La idea de hacer disponibles consultas de datos de tan bajo nivel a través de la API HTTP parece una pesadilla de seguridad.


+1, para sobornar el problema de compatibilidad del navegador. Además, escribir código comercial en JavaScript requiere una habilidad adicional y no le permite usar métodos en sus clases de negocios.
NoChance

2

Si bien hay muchas escuelas de pensamiento sobre esto, y ciertamente ninguna forma puede llamarse "la forma correcta" universalmente, mientras que todas las demás son "la forma incorrecta" universalmente, hay una serie de razones para aislar la lógica empresarial en el lado del servidor , y acceder a esos objetos y servicios a través de un servicio RESTful.

La respuesta breve es que se trata principalmente de la gestión de riesgos y el monitoreo y mejora del rendimiento.

En detalle:

La razón principal número 1 es la seguridad. Nunca se debe confiar en los clientes para que envíen otra cosa que no sea basura al servidor, y al mantener los aspectos de seguridad del lado del servidor, aísla el riesgo potencial de que un usuario no autorizado dañe su sistema. Recuerde, Javascript es completamente del lado del cliente, y trivialmente modificable, por lo que NO PUEDE CONFIAR EN LA SALIDA.

La razón número 2 es la separación de las preocupaciones. Es posible que su programador de JavaScript no sea un experto en seguridad y que su gurú de la seguridad no sea tan bueno en Javascript. Al aislar la lógica de negocios de la lógica de presentación, evita cruzar estas preocupaciones, ya que no se permitirá que javascript acceda a los recursos más allá de sus niveles de permiso, y se le darán errores, cuyo manejo está dentro de la versión anterior del Script Programmer. Del mismo modo, el tipo de seguridad no depurará Javascript para ver cómo se mantiene la seguridad.

La razón número 3 es el rendimiento. La lógica empresarial puede ser potencialmente exigente con los recursos del servidor y la base de datos. Al mantener esa lógica aislada de sus elementos de la interfaz de usuario, puede escalar solo esa parte de su aplicación, lo que hace que sea mucho más fácil abordar los cuellos de botella. Además, es mucho más fácil aislar qué proceso empresarial está cargando el sistema o la base de datos de la base de datos si los procesos empresariales se ejecutan en el servidor.

Un corolario aquí es que, a menudo, varios procesos empresariales utilizarán los mismos datos, por lo que puede implementar el almacenamiento en caché en el lado del servidor para reducir la carga general del sistema que podría no ser posible / seguro para dar acceso a los códigos del lado de los clientes.

Finalmente, propondría que para mantener los estándares ACID, Business Logic realmente necesita estar en el servidor. Recuerdo haber mantenido un producto de facturación que se ejecutaba en el navegador web, con solo una conexión de base de datos al servidor. Si la facturación diaria (¡que podría tomar una hora o más en un buen día!) Se interrumpe, por ejemplo, cuando el navegador se cierra o falla, podría tomar varias horas resolver el desastre que causó en la base de datos, que quedó en un estado inconsistente Recuerde, esto también implicaba tarjetas de crédito, por lo que los registros de facturación también debían verificarse con el procesador.

La lógica empresarial del lado del servidor es en su mayoría trivial para garantizar actualizaciones de ACID, ya que existen marcos para cualquier lenguaje para mantener las transacciones, ya sea a nivel de aplicación o de base de datos. Si está haciendo esto a través de múltiples actualizaciones desde un cliente web ... obtendrá un estado inconsistente en algún momento, y es probable que afecte a su aplicación.

Si bien puede ser tentador pensar en los servicios RESTful como una simple forma de acceder a la base de datos, no debe caer en esta trampa, ya que es una buena receta para el desastre. El modelo de objetos que expone a través de un servicio RESTful puede estar relacionado con su base de datos, pero realmente debería encapsular su lógica empresarial en lugar de simplemente usarlo como un motor CRUD.


+1 por aumentar muchos puntos buenos. El sistema de facturación que utilizó como ejemplo tiene el diseño más extraño del que he oído hablar.
NoChance

También tenía el nombre más extraño que he escuchado, aunque todavía veo referencias a él dando vueltas. Se llamaba HURLnet ISP Admin, y era bastante difícil de mantener. Teníamos una licencia de código fuente completa, y la utilicé ampliamente una vez que dejaron de admitirla.
SplinterReality
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.