Você está na página 1de 3

11/09/2020 ASP .NET Core 3.

1 - Entendendo CQRS

.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.

Os comandos devem ser baseados em tarefas, e não centrados em dados;


Os comandos podem ser colocados em uma fila para processamento assíncrono, em vez de serem processados de
forma síncrona;
As consultas nunca modificam o banco de dados. Uma consulta retorna um DTO que não encapsula nenhum
conhecimento de domínio;

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.

www.macoratti.net/20/08/c_cqrs1.htm 1/3
11/09/2020 ASP .NET Core 3.1 - Entendendo CQRS

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:

Escala independente. O CQRS permite que as cargas de trabalho de leitura e gravação sejam escalonadas
independentemente e pode resultar em menos contenções de bloqueio;
 
Esquemas de dados otimizados. O lado de leitura pode usar um esquema otimizado para consultas, enquanto o
lado de gravação usa um esquema otimizado para atualizações;
 
Segurança. É mais fácil garantir que apenas as entidades de domínio corretas estejam executando gravações nos
dados;
 
Separação de responsabilidades. A segregação dos lados de leitura e gravação pode resultar em modelos mais
flexíveis e fáceis de manter. A maior parte da lógica de negócios complexa entra no modelo de gravação. O modelo
de leitura pode ser relativamente simples;
 
Consultas mais simples. Ao armazenar uma visualização materializada no banco de dados de leitura, o aplicativo
pode evitar junções complexas durante a consulta.

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

Complexidade. A ideia básica do CQRS é simples. Mas isso pode levar a um design de aplicativo mais complexo,
especialmente se eles incluírem o padrão Event Sourcing.

Nota: A ideia fundamental do padrão Event Sourcing é garantir que todas as alterações no estado de um aplicativo
sejam capturadas em um objeto de evento e que esses objetos de evento sejam armazenados na sequência em que
foram aplicados pelo mesmo tempo de vida útil do estado do aplicativo.
 
Mensagens. Embora o CQRS não exija mensagens, é comum usar mensagens para processar comandos e publicar
eventos de atualização. Nesse caso, o aplicativo deve lidar com falhas de mensagens ou mensagens duplicadas.
 
Consistência eventual. Se você separar os bancos de dados de leitura e gravação, os dados de leitura podem ficar
obsoletos. O armazenamento do modelo de leitura deve ser atualizado para refletir as alterações no
armazenamento do modelo de gravação e pode ser difícil detectar quando um usuário emitiu uma solicitação com
base em dados de leitura obsoletos;

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.

www.macoratti.net/20/08/c_cqrs1.htm 2/3
11/09/2020 ASP .NET Core 3.1 - Entendendo CQRS

- 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 :

O domínio ou as regras de negócios forem simples.


Uma interface de usuário simples no estilo CRUD e operações de acesso a dados forem suficientes.

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:

Macoratti .net | Facebook


macoratti - YouTube
Jose C Macoratti (@macorati) | Twitter
Padrões de Projeto - Macoratti.net
NET - Usando padrões de projeto e princípios ... - Macoratti.net
.NET - Você já esta usando Padrões de Projeto ... - Macoratti.net
Design Patterns - Identificando e Aplicando padrões
https://martinfowler.com/bliki/CQRS.html
https://martinfowler.com/eaaDev/EventSourcing.html
https://docs.microsoft.com/pt-br/azure/architecture/patterns/cqrs

José Carlos Macoratti

www.macoratti.net/20/08/c_cqrs1.htm 3/3

Você também pode gostar