Qual é a melhor maneira de escalar um sistema CQRS?

5

Nos meses anteriores, tenho feito muitas perguntas sobre a arquitetura de um aplicativo em que estou trabalhando. Graças às respostas, o design arquitetônico mudou - na verdade, ele foi simplificado, como mostra o gráfico a seguir:

Internamente, eu tenho dois serviços ( NOT WCF! ) que seguem os princípios do CQS. Isso significa que o serviço de consulta simplesmente retorna exibições de banco de dados; enquanto o serviço de comando possui um modelo de domínio completo que contém toda a lógica de negócios e repositórios para acessar o banco de dados (nenhum mecanismo de evento ou outro padrão complexo aqui). Ambos os serviços usam o mesmo banco de dados. Esses serviços são bibliotecas de classes, NO WCF services, porque eles são usados apenas internamente, então eu não preciso da sobrecarga do WCF (não distribuo seus objetos, a primeira lei de Martin Fowler).

Essas operações internas são usadas pelo site da ASP.NET MVC e pelo PartnerService. Este PartnerService é um serviço WCF, que expõe a funcionalidade que gostaria de ser exposta aos parceiros.

Se eu precisar escalonar por causa do alto tráfego, eu poderia adicionar servidores da Web e / ou migrar peças para um sistema CQRS completo (meus contratos já foram projetados para isso).

Alguém vê algum problema com isso?

Uma coisa que vejo é que, se a consulta ou o serviço de comando mudar, isso afeta o site e o serviço do parceiro diretamente; portanto, preciso implantar as alterações em ambos. Mas eu não sei se isso é um problema ...?

Qualquer feedback é apreciado! Obrigado!

    
por L-Four 06.09.2011 / 17:38
fonte

3 respostas

4

Acho que você é um vencedor aqui.

Você tem várias opções para escalar (desde a mais fácil até exige algum esforço).

  1. Compre uma máquina maior.
  2. Executar cada componente em seu próprio servidor.
  3. Executar mais servidores para cada componente (exceto para o banco de dados)
  4. Replique o banco de dados e atenda às consultas de "visitantes" da replicação.
  5. Particione o banco de dados por "id de membro" e execute várias instâncias separadas do banco de dados para atender a esse grupo de membros.

Se você precisar escalar mais, então você é "facebook" e pode pagar uma reescrita.

    
por 07.09.2011 / 06:14
fonte
2

Uma coisa que você poderia fazer para permitir um pouco mais de flexibilidade no lado da consulta das coisas, é definir seus contratos com os pontos de extensão. Fowler discute isso aqui:

link

Ele essencialmente permite que você adicione propriedades que são expostas através do serviço sem prejudicar os consumidores existentes, portanto, se o site precisar de outra propriedade exposta, você poderá fornecê-lo através do serviço sem interromper o serviço de parceiro.

"This allows the ProductSearch service to return results that include product descriptions, and consumers using the new schema to validate the entire document. Consumers using the old schema will not break, though they will not process the description."

Esse artigo inteiro é uma boa leitura de serviços que evoluem ao longo do tempo.

    
por 06.09.2011 / 18:01
fonte
2

A única pergunta que eu tenho é como o serviço de comando processa seus comandos. Eles são manipulados de forma astérica ou seu cliente está aguardando o serviço de comando processar o comando e concluir a gravação no repositório antes de retornar um ack / nack? Se você está procurando por escalabilidade, essa pode ser uma área em que você poderia se concentrar para melhorar a escalabilidade.

Além disso, fica bem na superfície.

Boa sorte !!

    
por 06.09.2011 / 20:47
fonte