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