Serviço REST como servidor de aplicativos para mais de 2000 máquinas clientes. É uma boa ideia?


11

Vamos construir um sistema com a interface do usuário em javaFx que será implantado em mais de 2000 máquinas (o mínimo é 2000, mas será mais - pode chegar a 5000 máquinas).

Por outras razões / limitações, ele deve ser instalado na máquina, portanto, não podemos fazê-lo com uma interface do navegador da web.

As mais de 2000 máquinas estarão em diferentes grupos de localização geográfica. Em geral, a conexão é boa, mas pode não ser tão boa em locais mais remotos.

Em vez de acessar o banco de dados diretamente, estou pensando em criar um cluster de serviço REST com Spring + Spring Boot + Spring Data (java).

O serviço REST aceitaria e retornaria Json.

Eu acho que é uma boa ideia porque:

  • O serviço atuaria como um pool de conexão com o banco de dados (acho que mais de 2000 conexões em um banco de dados causariam problemas);
  • É possível ter um banco de dados com envio de log para outro banco de dados somente leitura para atender a algumas consultas;
  • Escalaria melhor, pois podemos adicionar mais máquinas para executar os serviços REST;
  • É possível usar HTTPS com compactação por motivos de segurança e economia de largura de banda;
  • É possível fazer algumas alterações centralizadas nas entidades comerciais sem reimplementar as mais de 2000 máquinas;
  • Ele se integra melhor a outros sistemas (basta apontar para o serviço REST).

É realmente uma boa ideia?

Você pode compartilhar alguma experiência positiva ou negativa?

Obrigado.


1
Eu acho que é uma ideia sensata, principalmente porque o REST foi projetado com o cache em mente. Você pode considerar o uso de websockets para reduzir a carga de conexões de clientes não persistentes, mas isso depende do padrão de uso da sua API. O WebSocket começa a mostrar seus pontos fortes quando é possível multiplexar um grande número de pequenas transações de req / res em conexões persistentes. Dito isto, pode ser mais simples apenas escalar ...
blz

8
Os bancos de dados nunca devem estar acessíveis na Internet pública e sempre devem estar protegidos por um firewall - portanto, protegê-los por meio de uma API REST ou similar é um procedimento padrão. Isso também permite adicionar outros recursos de segurança com mais facilidade, por exemplo, impedir que os usuários editem entradas de dados que eles não estão autorizados a ver ou editar.
21617

Respostas:


3

Esta é uma pergunta aberta com muitas respostas possíveis que dependem do que você está tentando fazer. No entanto, adicionarei algumas coisas como resposta, pois um comentário não será grande o suficiente.

O serviço atuaria como um pool de conexão com o banco de dados (acho que mais de 2000 conexões em um banco de dados causariam problemas);

Sim, essa é uma boa ideia. Você mantém um número menor de conexões abertas e as reutiliza à medida que as solicitações chegam ao serviço. Mas você precisa saber com que rapidez as solicitações serão atendidas e quanto cada solicitação utiliza o banco de dados; caso contrário, um pequeno pool pode ser facilmente esgotado e outras solicitações serão bloqueadas enquanto aguarda a liberação de uma conexão com o banco de dados.

O cache pode ajudar lá, para retornar dados já buscados (como eu disse, depende do que você está tentando fazer - se as consultas forem exclusivas, você não poderá armazenar muito em cache).

Observe também que o tamanho do pool será multiplicado pelo número de serviços que você implementa. Alguns serviços e você pode usar tamanhos de pool de banco de dados grandes; mais serviços e você precisa diminuir o tamanho do conjunto, para que você tenha o mesmo número de conexões abertas no banco de dados, em geral.

É possível ter um banco de dados com envio de log para outro banco de dados somente leitura para atender a algumas consultas;

O banco de dados pode facilmente se tornar seu gargalo. Muitas conexões e / ou muitas consultas e você pode quebrá-lo. Nesse ponto, não importa que você possa escalar horizontalmente seus serviços para qualquer número. Todas as solicitações chegarão ao mesmo banco de dados.

Existem várias maneiras de protegê-lo: cache que eu já mencionei (depende do seu caso de uso), duplique algumas informações em outros servidores para atender a algumas consultas, como você menciona, CQRS (depende do seu caso de uso), use um relacional versus não relacional (depende do seu caso de uso novamente) etc.

Observe, porém, que quando você distribui dados assim, o teorema do CAP começa a se aplicar. Esteja ciente disso, pois pode ser necessário comprometer a consistência e a disponibilidade.

Escalaria melhor, pois podemos adicionar mais máquinas para executar os serviços REST;

Sim, o serviço REST será dimensionado, mas, como mencionei acima, se você não proteger o banco de dados, isso poderá se tornar um gargalo facilmente.

É possível usar HTTPS com compactação por motivos de segurança e economia de largura de banda;

Sim, assim como outras coisas ... talvez você queira autenticação / autorização posteriormente, etc.

É possível fazer algumas alterações centralizadas nas entidades comerciais sem reimplementar as mais de 2000 máquinas;

Sim, mas até certo ponto e nem todo tipo de mudança. Se você fizer uma alteração de última hora, também precisará atualizar os clientes. Portanto, pense em uma estratégia para atualizar os clientes para a versão mais recente ou se você permitir que clientes mais antigos ainda funcionem e usem o aplicativo.

Ele se integra melhor a outros sistemas (basta apontar para o serviço REST).

Sim, mas isso significa clientes para o seu serviço que talvez você não possa controlar.

Se você fizer uma alteração de última hora e tiver uma boa estratégia para atualizar seus clientes 2000+ JavaFX, não há problema. Porém, se existirem outros clientes e você não tiver controle sobre eles, poderá ser necessário implementar a versão no serviço REST e oferecer suporte a mais de uma versão até que todos possam atualizar para a versão mais recente.

Como eu disse, depende do que você está tentando fazer. No geral, a sua é uma boa ideia. Mas esteja ciente de que as coisas não serão gratuitas apenas porque você coloca um serviço REST na frente de um banco de dados.

Apenas meus 2 centavos!


Boa resposta. Eu só queria destacar para Thiago que vale a pena considerar a versão em uma API RESTful o mais rápido possível. Pode não ser necessário fazê-lo no início, mas você deve estar ciente e estar preparado.
Daniel Hollinrake 23/02
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.