Pergunta

Eu preciso projetar um sistema que tenha esses componentes básicos:

  • Um servidor da web que receberá ~ 100 solicitações/s. O servidor da web precisa apenas despejar dados no repositório de dados brutos.
  • Repositório de dados brutos, que possui uma única tabela que recebe 100 linhas/s do servidor da web.
  • Uma unidade de processamento de dados brutos (processamento simples, não muito. Removendo dados brutos inválidos, inserindo componentes ausentes em dados brutos danificados etc.)
  • Repositório de dados processados

Faz sentido em tal sistema ter uma camada de serviço na qual todos os componentes seriam construídos? Toda a interação entre componentes passará pelas camadas de serviço. Embora isso tornasse o sistema facilmente atualizado e sustentável, também não teria um impacto significativo no desempenho, pois tenho muito tráfego para lidar?

Foi útil?

Solução

O que você vê como os custos de ter uma camada de serviço separada?

Como esses custos se comparam aos custos que você devo incorrer? No seu caso, isso parece ser pelo menos

  1. Uma rede lida para o pedido
  2. Um banco de dados grava para dados brutos
  3. Uma leitura de banco de dados de dados brutos
  4. um banco de dados gravação de dados processados

Além de alguns dados munging.

Que tipo de serviço você tem uma mente? Talvez

  • Saverawdata ()
  • getNexTrawData ()
  • WriteProcededData ()

Por que a sobrecarga é mais do que uma chamada de procedimento? O serviço não precisa implicar "processo separado" ou "marechaling da web".

Eu afirmo que a estrutura é sempre de valor, a separação de preocupações em seu aplicativo realmente importa. Em comparação com as atividades do banco de dados, algumas chamadas de procedimentos raramente custam muito.

De passagem: a persistência dos dados brutos pode ser melhor feita em um sistema de filas. Você pode obter uma escala natural com muitos leitores de fila em máquinas separadas, se precisar. De fato, o sistema de filas está introduzindo naturalmente alguns conceitos semelhantes a serviços.

Outras dicas

Aqui está o que pode acontecer a menos que você se proteja contra isso.

Na comunicação entre camadas, algum formato é escolhido, como o XML. Em seguida, você o constrói e o executa e descobre que o desempenho não é satisfatório.

Então você mexe com perfiladores que deixam você adivinhando qual é o problema.

Quando trabalhei em um problema como este, usei o Técnica de pilha e rapidamente encontrou o problema. Você teria pensado que era I/S. NÃO. Foi que a conversão de dados em XML e analisando o XML para recuperar a estrutura de dados estava levando aproximadamente 80% do tempo. Não era muito difícil encontrar uma maneira melhor de fazer este. Resultado - uma aceleração de 5x.

Pessoalmente, sinta que você pode estar se concentrando demais em detalhes de implementação de baixo nível ao projetar o sistema. Antes de analisar como estabelecer os componentes, montagens ou serviços, você deve estar pensando em como arquitetar o sistema.

Você pode começar com as seguintes declarações de alto nível para construir sua arquitetura do sistema:

  1. Confirme o conjunto de habilidades técnicas da equipe de desenvolvimento e da equipe de operações/suporte.
  2. Concorde com uma lista finita inicial de sistemas que se integrarão ao seu serviço, dos protocolos que eles suportam e alguns SLAs.
  3. Decida a estratégia de mensagens.
  4. Entenda como você implantará seu serviço/sistema.
  5. Decida a escolha do middleware (ESBs, corretores de mensagens, etc), bancos de dados (SQL, Oracle, Memcache, DB2, etc) e estruturas/ferramentas de terceiros.
  6. Decida sua estratégia de armazenamento em cache e latência de dados.
  7. Divida sua aplicação nas várias áreas de responsabilidade comercial - isso permitirá dividir o trabalho e permitir uma comunicação mais fácil de marcos durante o desenvolvimento/teste e implementação.
  8. Projete cada componente conforme necessário para atender às áreas de responsabilidade. As áreas de responsabilidade devem levar você automaticamente a decidir como projetar componentes, montagem ou serviço.

Obviamente, nem tudo isso corresponderá ao seu caso específico, mas eu sugeriria que eles tenham pelo menos um pouco de pensamento.

Boa sorte.

A abstração e a camada introduzirão latência, mas a verdadeira questão é: o que você está ganhando para tornar os custos que valem a pena? Acoplamento, governança, escalabilidade e manutenção soltos valem a pena $.

Até o aplicativo em camadas mais bem projetado exibirá mais latência do que um aplicativo conversando diretamente com um banco de dados. Os usuários que conhecem o sistema original sentirão a diferença. Eles podem não gostar, então isso pode ser uma questão política tanto quanto técnica.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top