Por que um desenvolvedor deve usar serviços da web em vez de conexões diretas com um banco de dados? [fechadas]

93

Estou procurando uma lista dos dez principais motivos pelos quais devemos nos conectar a bancos de dados remotos via serviço da web em vez de nos conectarmos diretamente ao banco de dados. Este é um debate interno agora e estou pró-serviço da web, mas perdendo o argumento. Eu tenho uma compreensão básica de serviços WCF / web, ninguém mais tem. Podemos fazer o que quisermos no futuro, mas precisamos nos ater ao que escolhermos agora.

Aqui está o que eu descobri. Não mais?

  1. Os serviços web WCF podem, se configurados corretamente, ser mais seguros.
  2. Mudanças no banco de dados só precisam ser feitas no nível de serviço (arquivo de configuração ou serviço de recompilação).
  3. Depois de configurados e hospedados, os serviços da web são mais fáceis de consumir.
DenaliHardtail
fonte

Respostas:

120
  1. Segurança. Você não está concedendo acesso ao banco de dados a ninguém, exceto ao usuário do servidor / aplicativo da web.

    Isso é extremamente importante quando você tem muitos usuários. Você evita a dor de manutenção de usuário / função no lado do banco de dados.

  2. Redução de carga DB. O serviço da Web pode armazenar em cache os dados que recuperou do banco de dados.

  3. Pool de conexão de banco de dados (hat / tip @Dogs).

    Um serviço da web pode usar um pequeno pool de conexões de banco de dados abertas permanentemente. O ajuda de várias maneiras:

    • O conjunto de conexões de banco de dados é limitado no lado do servidor de banco de dados.

    • abrir uma nova conexão de banco de dados é MUITO caro (especialmente para o servidor de banco de dados).

  4. Capacidade de tolerância a falhas - o serviço pode alternar entre fontes de dados primárias / DR sem que os detalhes de failover sejam implementados pelos consumidores do serviço.

  5. Escalabilidade - o serviço pode distribuir solicitações entre várias fontes de dados paralelas sem que os detalhes da seleção de recursos sejam implementados pelos consumidores do serviço.

  6. Encapsulamento. Você pode alterar a implementação do banco de dados subjacente sem afetar os usuários do serviço.

  7. Enriquecimento de dados (isso inclui qualquer coisa, desde personalização do cliente até localização e internalização). Basicamente, qualquer um deles pode ser útil, mas qualquer um deles é uma grande carga no banco de dados e geralmente muito difícil de implementar dentro de um banco de dados.

  8. Pode ou não se aplicar a você - certas decisões de arquitetura não são fáceis de acessar ao banco de dados. Por exemplo, os servidores Java rodando em Unix têm um acesso fácil a um banco de dados, enquanto um cliente Java rodando em um PC Windows não reconhece o banco de dados nem você possivelmente deseja que ele o seja.

  9. Portabilidade. Seus clientes podem não estar todos na mesma plataforma / arquitetura / idioma. Recriar uma boa camada de acesso a dados em cada um deles é mais difícil (uma vez que deve levar em conta questões como failovers mencionados acima / etc ...) do que construir uma camada de consumidor para um serviço da web.

  10. Ajuste de desempenho. Supondo que a alternativa seja clientes executando suas próprias consultas (e não procedimentos armazenados pré-enlatados), você pode ter 100% de certeza de que eles começarão a usar consultas abaixo do ideal. Além disso, se o serviço da web limitar o conjunto de consultas permitidas, ele pode ajudar significativamente no ajuste do banco de dados. Devo acrescentar que essa lógica é igualmente aplicável a procedimentos armazenados, não exclusivo para serviços da web.

Uma boa lista também pode ser encontrada nesta página: 'Encapsulating Database Access: An Agile "Best" Practice'

Só para ficar bem claro - alguns desses problemas podem não ser aplicáveis ​​a TODAS as situações. Algumas pessoas não se importam com a portabilidade. Algumas pessoas não precisam se preocupar com a segurança do banco de dados. Algumas pessoas não precisam se preocupar com a escalabilidade do banco de dados.

DVK
fonte
26
Desculpe, discordo. 1. Assim, você concede acesso ao banco de dados a um grupo em vez de um único principal - sem diferença. 2. Qualquer aplicativo pode armazenar dados em cache. O tipo de dados que podem ser armazenados em cache entre vários usuários geralmente serão dados de baixo volume em qualquer caso. 3. O FT deve ser tratado pelo banco de dados em qualquer caso. 4. Este não é um recurso pronto para uso e deve ser programado. 5. Sua camada de acesso a dados deve fazer o encapsulamento. 6. Mesma coisa. 7. Sério? JDBC não funciona em um cliente? 8. Boa observação, quando importa, o que é raro. 9. consulta vs. SP não fazia parte da pergunta.
John Saunders
7
1. Tente gerenciar isso em 5.000 usuários com centenas de funções. Não escala mais tão bem. 2. Depende inteiramente de um aplicativo. Nosso caso atual tem uma instância de resultados de cache de uma consulta que, no caso de uber-otimizado, leva 20 minutos para ser executada e que precisamos executar centenas de vezes por dia, pelo menos, a partir de aplicativos diferentes. 3. O FT é tratado em vários níveis. O que quer dizer "deve ser tratado por um banco de dados"?
DVK
4
4. Claro que tem que ser programado. Mas ele pode ser programado no serviço uma vez ou em um zilhão de aplicativos clientes em várias plataformas com recursos variados. Existe uma grande diferença. Esqueça as questões de gerenciamento de configuração para balanceamento de carga. 5. Mesmo raciocínio. Você não precisa reimplementar o DAL. Na verdade, você pode simplesmente pensar no serviço da Web como um DAL portátil para relaxar sua mente. 7. Não queremos que todo cliente abra conexões de banco de dados. Isso é algo tão grande a se pedir? Novamente, você está esquecendo os pontos 1-5.
DVK
2
8.> 1 arquitetura de cliente acontece com MUITA freqüência. Na verdade eu nunca trabalhei em um projeto sem tal situação na minha vida, mas estou centrado no mundo financeiro. 9. Não foi. Eu estava basicamente bancando o advogado do diabo.
DVK
2
Gostei da resposta, mas acho que você ignorou um dos pontos mais importantes: pool de conexão. Se você tiver 1.000.000 de clientes, terá 1.000.000 de conexões abertas ou milhões de conexões sendo abertas e fechadas constantemente. A intuição básica sobre a organização do computador nos diz que um pool bem ajustado de algumas centenas de conexões de longa duração é astronomicamente mais eficiente do que ter um milhão de conexões de longa duração ou milhões de conexões de curta duração. O HikariCP fez um ótimo trabalho ao elaborar essa ideia: github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
Cães
15

Em minha opinião, você não deve expor automaticamente seu banco de dados como um serviço da web. Se você precisar de um serviço para expor seus dados, escreva um, mas nem todo acesso ao banco de dados deve ser feito por meio de serviços da web.

  1. Não há razão para que uma conexão de banco de dados não seja segura
  2. Você pode encapsular o banco de dados em uma camada de acesso a dados (possivelmente Entity Framework)
  3. Os serviços da Web não são mais fáceis de consumir do que uma camada de acesso a dados bem escrita.
John Saunders
fonte
Por que necessariamente XML? Também há muito mais leve para analisar JSON, CSV para dados planos simples, etc ...
DVK
Não é "sem motivo". Conforme observado sobre, dependendo de seus requisitos e desejos para desenvolvimento futuro, pode ser necessário para seu projeto.
Chris Stewart
Eu escrevo meu WS para consumir um DAL. Em qual porta você sugeriria expor um DAL?
samis
@samus, não importa.
John Saunders
"Não há razão para que uma conexão de banco de dados não seja segura", bem, é difícil, por exemplo, proteger a conexão entre um cliente Windows e um banco de dados. Realmente difícil implementar uma conexão segura!
NoChance 01 de
12
  • Os Web Services formam uma API, definindo as interações permitidas entre os sistemas externos e os dados do aplicativo.
  • Os serviços da Web separam o banco de dados das interações externas e permitem que a camada de dados seja gerenciada independentemente das influências externas.
  • Permitir o acesso apenas por Web Services garante que a lógica do aplicativo tenha a chance de ser executada, protegendo a integridade dos dados.
  • Os serviços da Web permitem que as medidas de autenticação / autorização mais apropriadas sejam tomadas, ao contrário de um banco de dados que exige um nome de usuário e senha / privilégios de nível de tabela.
  • Os serviços da Web fornecem uma oportunidade para o uso de descoberta e configuração automática de serviço.
  • O tráfego de serviços da Web pode ser criptografado para trânsito em redes não seguras. Não conheço nenhuma solução de conexão direta de banco de dados que permita isso ...?

A maioria desses pontos se aplica a qualquer API formal, não especificamente aos Web Services.

Brabster
fonte
1
Sim, era o que eu ia dizer, se você tiver um único aplicativo acessando um banco de dados, todos os seus pontos estarão disponíveis para APIs normais também.
Ignacio Soler Garcia
“Os Web Services formam uma API, definindo as interações permitidas entre os sistemas externos e os dados do aplicativo”. Você também pode fazer isso com um banco de dados.
Shoe
"Permitir o acesso apenas por Web Services garante que a lógica do aplicativo tenha a chance de ser executada, protegendo a integridade dos dados." - Eu diria que a integridade dos dados deve fazer parte apenas do DBMS.
Shoe
@Shoe É bom impor o máximo de integridade possível pelo banco de dados, mas à medida que os dados começam a preencher e expor deficiências, como a necessidade de alguma validação de entrada, é bom impor isso no nível do aplicativo (embora eu prefira aplicar no do lado do cliente, às vezes precisa ser tratado no lado do servidor se as regras de validação dependerem de dados conhecidos apenas pelo servidor (mantidos do aplicativo cliente)). É uma grande coisa mudar o conjunto de regras de integridade de um banco de dados, eu imagino que não seja uma questão trivial?
samis
2

Escrever um serviço da Web que simplesmente empacote chamadas para procedimentos armazenados parece ser uma abordagem equivocada para projetar um bom DAL. Mais do que provavelmente, seus procedimentos armazenados são códigos legados remanescentes de sistemas cliente-servidor mais antigos, ou seja, regras de negócios estão enterradas nos SPs. Se for esse o caso, o que você está realmente tentando fazer é criar uma bolsa de seda com a orelha de uma porca.

Além disso, você adiciona uma camada de protocolo de mensagem SOAP que adiciona um impacto de desempenho aos aplicativos da web que foram 'coagidos' a namorar esse 'porco'. Estou trabalhando em um projeto agora em que nosso novo aplicativo MVC-4 foi instruído a usar esse DAL. Temos o fardo de alterar a assinatura WebMethod e a assinatura SP sempre que uma nova história de usuário surgir, necessitando de tais alterações; que para nós, é cada sprint. Inerentes a essa abordagem de passagem estão duas camadas fortemente acopladas.

Sevasanakid
fonte
1
A API da Web abordou o problema de aumento do WCF / SOAP. Agora é como um felino leve, em forma e ágil; apenas o que é necessário para servir com REST.
samis
Em teoria, não é errado chamar procs armazenados usando serviços da web.
NoChance 01 de
2

1) A dor de cabeça de manter o banco de dados é reduzida do lado dos desenvolvedores para que eles possam se concentrar apenas no desenvolvimento.

2) O serviço Web suporta a comunicação de diferentes plataformas (sistemas operacionais como windows, ios, android etc) de um método muito fácil e eficaz. por exemplo, considere uma situação em que o aplicativo Android e o aplicativo ios desejam se comunicar com um site que é baseado em java, portanto, para a comunicação de todas as três coisas, o serviço da web é a melhor solução em vez de manter três bancos de dados diferentes.

Rohan
fonte
1

Em geral

  1. O nível de serviço da Web promove a reutilização de solicitações de dados comuns para vários aplicativos
  2. O serviço da Web pode ser configurado com gerenciamento de versão que desvia muitos problemas decorrentes do desenvolvimento de nível de aplicativo. Por exemplo, se eu for novo em um projeto, qual aplicativo existente devo usar como um bom modelo para configurar meu aplicativo para usar fontes de banco de dados existentes.
  3. O Web Service evoluiu para permitir opções flexíveis para enviar solicitações e obter resultados de resposta em um formato comum, como JSON, usando um URI simples, o que significa que os aplicativos cliente podem ser desenvolvidos usando um padrão mais comum que incentiva interfaces uniformes confiáveis.

Estou começando a usar ASP.NET Web Api e planejo fazer serviços de dados primeiro.

Recentemente, tenho me concentrado em aplicativos da Web .NET MVC com o uso da estrutura de entidade.

  1. Se você já usa MVC, a API da Web também usa MVC com o controlador de API, de modo que a curva de aprendizado para construir os serviços é bastante fácil.

Recentemente, me encontrei em uma situação frustrante com um aplicativo da web MVC que estava construindo originalmente com base em procedimentos armazenados da Oracle. A versão original como Oracle 9 ou mesmo anterior que apresentava outro problema com o Visual Studio 2012 empurrando uma abordagem de fábrica de conexão mais moderna com assemblies de tempo de carregamento encontrando os arquivos dll certos para usar com base em conexões de configuração da web e nomes TNS.

As tentativas de conexão com o banco de dados falharam com mensagens de erro 'não mais suportadas'. Por curiosidade, baixei o Oracle 12c e fiz algumas conexões em nível de aplicativo que funcionaram bem com meus nomes TNS e a dll de montagem de carga e consegui trabalhar com o Oracle sem problemas.

Havia alguns serviços da web construídos que funcionavam com conexões com a versão mais antiga do Oracle. Eles foram construídos com métodos que foram mapeados especificamente para tabelas selecionadas, no entanto, para minha decepção. Eu teria que escrever meu próprio.

Disseram-me que o grupo responsável pela manutenção dos bancos de dados Oracle estaria escrevendo novos procedimentos armazenados para substituir os mais antigos que eu estava usando para abstrair a interface do cliente e as camadas de lógica de negócios.

Então, meu primeiro pensamento foi que todas as solicitações de dados comuns, como preencher lista suspensa ou preenchimento automático com dados de toda a empresa, fossem feitas por meio de serviços de dados que chamariam os procedimentos armazenados do Oracle. Por que repetir esse processo em cada aplicativo e fazer com que cada desenvolvedor tenha problemas com configuração e montagem de versão / carga e problemas de TNS?

tão....

  1. Para vários problemas de servidor de banco de dados, como o uso de procedimentos armazenados Oracle em um aplicativo .NET MVC que normalmente pode estar usando EF para o uso de dados do SQL Server, por que não empurrar essas dores de cabeça para métodos de serviço Web Api onde esses problemas de configuração podem ser isolados.
  2. Novamente, a interface do cliente pode ser feita usando JavaScript, JQuery e JSON, os quais você já está usando, se estiver usando a API da Web para fazer solicitações de dados do SQL Server.

Eu sou um desenvolvedor / analista de aplicativos e não um DBA, então minha perspectiva é a experiência com a frustração sem fim de ter que modificar constantemente os aplicativos quando as ferramentas de banco de dados evoluem.

Brian Quinn
fonte