.NET - Entendendo o padrão CQRS


 Hoje vamos apresentar os principais conceitos da CQRS - Command Query Responsibility Segregation.

O acrônimo CQRS significa Command Query Responsibility Segregation ou, numa tradução livre, Segregação de Responsabilidade de Consulta e de Comando, e é utilizado para aplicar modelos diferentes para operações de leitura e gravação.

Seria algo relacionado em como separar a responsabilidade de escrever dados da responsabilidade de ler os dados.

  1- Cenário clássico

  A figura à esquerda mostra o cenário clássico usando  um banco de dados para leitura e gravação (mesma base)
 

  2- Cenário com CQRS

  A figura à direita mostra o cenário usando CQRS onde temos a separação da escrita e da leitura em banco de dados distintos com sincronização (isso não é um requisito para indicar o uso do padrão)

Assim, o CQRS é um padrão de projeto arquitetural para separar os processos de leitura e gravação da sua aplicação. As alterações de dados são realizados via Commands e a leitura de dados são realizados via Queries.

Nota:  Commands representa tudo o que altera o estado de uma entidade (insert, update, delete). Queries não alteram estado da entidade (select);

A utilização do CQRS é indicada para um cenário onde existe uma alta demanda de consumo de dados com operações de leitura e escrita feitas de forma bem intensa.

Para este tipo de cenário o CQRS se apresenta como a solução da seguinte forma.

O CQRS separa leituras e gravações em modelos diferentes, usando comandos para atualizar dados e consultas para ler dados.

Para obter um maior isolamento, você pode separar fisicamente os dados de leitura dos dados de gravação. Nesse caso, o banco de dados de leitura pode usar seu próprio esquema de dados otimizado para consultas.

Por exemplo, ele pode armazenar uma visão materializada dos dados, para evitar junções complexas ou mapeamentos complexos de O/RM, podendo até usar um tipo diferente de armazenamento de dados.

Se forem utilizados bancos de dados de leitura e gravação separados, eles deverão ser mantidos em sincronia. Normalmente, isso é feito com o modelo de gravação publicando um evento sempre que ele atualiza o banco de dados. A atualização do banco de dados e a publicação do evento devem ocorrer em uma única transação.

A seguir alguns dos benefícios em usar o CQRS:

Alguns desafios da implementação desse padrão incluem:

Quando usar e quando não usar o CQRS

1- Considere usar o padrão CQRS para os seguintes cenários:

- Domínios colaborativos em que muitos usuários acessam os mesmos dados em paralelo. O CQRS permite definir comandos com granularidade suficiente para minimizar conflitos de mesclagem no nível do domínio, e os conflitos que surgem podem ser mesclados pelo comando.

- Interfaces de usuário baseadas em tarefas em que os usuários são guiados por um processo complexo como uma série de etapas ou com modelos de domínio complexos.

- Cenários em que o desempenho das leituras de dados deve ser ajustado separadamente do desempenho das gravações de dados, especialmente quando o número de leituras é muito maior que o número de gravações.

- Cenários em que uma equipe de desenvolvedores pode se concentrar no modelo de domínio complexo que faz parte do modelo de gravação e outra equipe pode se concentrar no modelo de leitura e nas interfaces do usuário.

- Cenários em que o sistema deve evoluir ao longo do tempo e pode conter várias versões do modelo ou em que as regras de negócios mudam regularmente.

- Integração com outros sistemas, especialmente em combinação com a fonte de eventos, em que a falha temporária de um subsistema não deve afetar a disponibilidade dos outros.

2- A utilização do CQRS não é recomendada quando :

Assim, considere a aplicação do padrão CQRS em seções limitadas do seu sistema, onde ele poderá ser mais valioso.

fonte: https://docs.microsoft.com/pt-br/azure/architecture/patterns/cqrs

Em outro artigo veremos um exemplo prático de implementação do padrão CQRS.

"Porque o reino de Deus não é comida nem bebida, mas justiça, e paz, e alegria no Espírito Santo."
Romanos 14:17

Referências:


José Carlos Macoratti