A lógica de negócios realmente pertence ao servidor?

10

Uma pilha típica para um aplicativo Web é um banco de dados, um servidor com código do servidor e um usuário com um navegador com HTML / CSS / JavaScript.

Antes do extenso AJAX, o MVC no qual o controlador era o código do lado do servidor era analisado. Um servidor precisava rotear solicitações de resposta para páginas da Web dinâmicas (ou seja, soluções html modeladas como JSP e ASP). O servidor para coordenar as chamadas ao banco de dados e decidir qual página dinâmica usar para responder à solicitação de página. O resultado de tudo isso é que o servidor acabou contendo a lógica de negócios, mesmo que a lógica de negócios não esteja fortemente ligada à idéia de exibir páginas.

Agora que estamos migrando para a "Web 2.0", um servidor servidores páginas estáticas que usam JavaScript para se preencher e alterar o que estão apresentando. O pode estar no JavaScript. O JavaScript geralmente implementa um serviço RESTful, o que significa que está especificando uma consulta ao banco de dados.

Portanto, o servidor fica com as funções de servir arquivos reais e atender chamadas AJAX. E atender chamadas AJAX é apenas gerenciamento de sessões e fornecer segurança. E, na verdade, o que um usuário deve até conseguir ver são dados que devem ser especificados no banco de dados.

Então, a partir daí, o servidor deve ser relegado ao papel de um intermediário burro que apenas ocasionalmente envia algo como enviar um email ou disparar um serviço da Web? A lógica de negócios poderia viver em JavaScript (quando não é secreto) ou viver em procedimentos armazenados quando é?

Será que faz sentido combinar servidores e bancos de dados ou fazer com que soluções de ERP como a SAP funcionem como servidores?

Joe
fonte

Respostas:

14

A lógica comercial quase sempre precisa ser executada em um servidor que você controla, por motivos de segurança. Se por "servidor" você quer dizer "servidor web", concordo que ele não precisa ter quase nenhuma lógica comercial. Mas você quase sempre precisa de um servidor de aplicativos com a lógica de negócios, seja dentro de um banco de dados ou de um servidor da Web ou seja separado e chamado pelo servidor da Web.

Existem aplicativos do mundo real em que o servidor da Web não faz nada além de expor a API do servidor de aplicativos via serviços da Web ou JSON.

Mesmo antes da Web 2.0 e do AJAX, não era realmente uma prática recomendada misturar sua lógica de negócios com as páginas ASP. Foi considerado melhor ter uma lógica de negócios independente e ter a parte do servidor da lógica de apresentação em ASP, JSP ou qualquer outra coisa. Portanto, a verdadeira mudança da web 2.0 é que a camada de apresentação pode estar totalmente em javascript. Eu meio que prefiro isso, pessoalmente.

psr
fonte
Bem, sim, eu concordo que a lógica de negócios não deve estar em um ASP. Esse é o ponto do MVC.
Joe
Essa resposta é de quase dois anos atrás, e agora coisas como o SproutCore estão na moda. No site da SproutCore, eles afirmam explicitamente que o objetivo é mover a lógica de negócios para o navegador (consulte: sproutcore.com/about ). Então ... o estado da web mudou agora? A lógica de negócios do cliente (via JS no navegador em particular) está correta ou até preferível?
JoeCool
@JoeCool SproutCore existia então. E as considerações de segurança de colocar a lógica de negócios no cliente não foram alteradas. Mas nem todos os aplicativos têm muitos problemas de segurança. Além disso, "toda a raiva" parece bastante exagerada para o SproutCore. Mas a viabilidade de fazer mais no cliente continuou a aumentar - exceto que o dispositivo móvel continuou ganhando destaque e eles continuam sendo desafiadores em termos de desempenho para muitos aplicativos.
Psr
@psr Concedido - mas você parecia ignorar completamente a lógica de negócios do cliente, quando, de fato, pelo menos algumas tecnologias populares hoje estão caminhando distintamente nessa direção.
JoeCool
6

O JavaScript geralmente implementa um serviço RESTful, o que significa que está especificando uma consulta ao banco de dados.

É aqui que você entendeu errado. REST não é CRUD.

Os recursos expostos pelo REST não são seus registros do banco de dados; eles são objetos totalmente gerenciados que se comportam de acordo com sua lógica de negócios. Quando o servidor recebe um POST ou PUT, ele não deve apenas validar e armazenar. Ele precisa executar qualquer coisa apropriada para o aplicativo.

Exemplo simples: um aplicativo semelhante ao twitter recebe tweets como mensagens POST em um determinado contêiner. O servidor analisa o contexto ("quem é você?", "Qual canal é esse?") E o conteúdo ("qualquer hashtags?", Índices de texto etc.) e armazena tudo isso nas respectivas filas. Provavelmente adiciona uma referência diretamente a todos os seus seguidores.

Isso dá muito trabalho além de simplesmente adicionar o recurso ao contêiner, tudo é definido pela sua lógica de negócios. E isso pertence ao servidor.

Javier
fonte
2

Minhas preocupações com essa abordagem podem dever-se a um mal-entendido de seu design, portanto, fique à vontade para me abater.

no entanto, pense na escalabilidade, manutenção e segurança do produto.

Se o seu produto crescer maciçamente, o banco de dados se tornará um gargalo, portanto, embora o "desempenho" sugira colocar a lógica de negócios em procedimentos armazenados, ele carrega carga adicional da CPU no servidor de banco de dados, antecipando o dia em que o servidor atingir a capacidade máxima. Ao contrário dos servidores da Web, os bancos de dados ACID não são facilmente escalonados usando hardware paralelo. Se o seu produto nunca será tão bem sucedido, isso não é um problema.

O pensamento de manter a lógica de negócios em javascript em execução em navegadores da web, onde diferentes navegadores exigirão javascriopt diferente, várias versões de navegadores, etc ... Por que tornar esse problema mais complicado do que já é?

Como Javiar disse, porém, o uso de uma abordagem REST como uma API de banco de dados para o seu produto não é realmente sensato. É um benefício de uma interface REST que outras pessoas pensem em diferentes maneiras de usar e consultar sua interface REST. No entanto, trata-se de recursos públicos de lógica de negócios pós e não de recursos de registro de tabela de baixo nível. O pensamento de disponibilizar essas consultas de dados de baixo nível pela API HTTP soa como um pesadelo de segurança.

Michael Shaw
fonte
+1, por subornar o problema de compatibilidade do navegador. Além disso, escrever código comercial em JavaScript requer uma habilidade extra e não permite que você use métodos em suas classes de negócios.
NoChance 18/10/11
2

Embora existam muitas escolas de pensamento sobre isso, e certamente nenhuma maneira pode ser chamada de "o caminho certo" universalmente, enquanto todas as outras são "o caminho errado" universalmente, existem várias razões para isolar a lógica de negócios no lado do servidor e acesse esses objetos e serviços por meio de um serviço RESTful.

A resposta curta é que se trata principalmente de gerenciamento de riscos, monitoramento e melhoria de desempenho.

Em detalhe:

O principal motivo número 1 é a segurança. Nunca se deve confiar nos clientes para enviar algo diferente de lixo para o servidor e, mantendo os aspectos de segurança do lado do servidor, você isola o risco potencial de um usuário não autorizado danificar seu sistema. Lembre-se de que o Javascript é totalmente do lado do cliente e é trivialmente variável, portanto você NÃO PODE CONFIAR NA SAÍDA.

A razão número 2 é a separação de preocupações. Seu programador javascript pode não ser um especialista em segurança, e seu guru da segurança pode não ser tão bom em Javascript. Ao isolar a lógica de negócios da lógica de apresentação, você evita cruzar essas preocupações, pois o javascript não terá permissão para acessar recursos além dos níveis de permissão e receberá erros, cuja manipulação está dentro da previsão do programador de scripts. Da mesma forma, o responsável pela segurança não estará depurando o Javascript para ver como a segurança é mantida.

O motivo número 3 é o desempenho. A lógica comercial pode potencialmente exigir recursos de servidor e banco de dados. Ao manter essa lógica isolada dos seus elementos de interface do usuário, você pode dimensionar apenas essa parte do seu aplicativo, facilitando muito a solução de gargalos. Além disso, é muito mais fácil isolar qual processo de negócios está carregando o sistema ou o back-end do banco de dados se os processos de negócios forem executados no servidor.

Um corolário aqui é que muitas vezes vários processos de negócios usam os mesmos dados e, portanto, você pode implementar o cache no servidor para reduzir a carga geral do sistema que pode não ser possível / segura para fornecer acesso ao código do cliente.

Por fim, proponho que, para manter os padrões ACID, a Business Logic realmente precise estar no servidor. Lembro-me de manter um produto de cobrança executado no navegador da web, com apenas uma conexão de banco de dados com o servidor. Se o faturamento diário (que pode levar uma hora ou mais em um bom dia!) For interrompido, digamos, pelo fechamento ou falha do navegador, poderá levar várias horas para resolver a bagunça que ele fez no banco de dados, que foi deixado em um estado inconsistente. Lembre-se, isso também envolvia cartões de crédito; portanto, os registros de cobrança também precisavam ser verificados no processador!

A lógica de negócios do servidor é basicamente trivial para garantir atualizações ACID, já que existem estruturas para qualquer idioma para manter transações, no nível do aplicativo ou do banco de dados. Se você estiver fazendo isso por meio de várias atualizações de um cliente da Web ... você terá um estado inconsistente em algum momento e provavelmente afetará seu aplicativo.

Embora possa ser tentador pensar nos serviços RESTful como simplesmente uma maneira de acessar o banco de dados, você não deve cair nessa armadilha, pois é uma boa receita para o desastre. O modelo de objeto que você expõe por meio de um serviço RESTful pode estar relacionado ao seu banco de dados, mas deve realmente encapsular sua lógica de negócios em vez de apenas usá-lo como um mecanismo CRUD.

SplinterReality
fonte
+1 por levantar muitos bons pontos. O sistema de cobrança que você usou como exemplo tem o design mais estranho que já ouvi falar.
NoChance
Também tinha o nome mais estranho que já ouvi, embora ainda veja referências por aí. Chamava-se HURLnet ISP Admin, e era o bicho de manutenção. Tínhamos uma licença completa de código-fonte, e eu a usei extensivamente assim que eles pararam de suportá-la.
SplinterReality