O Que É CQRS? Separando Leituras de Escritas
CQRS (Command Query Responsibility Segregation) divide um sistema em modelos separados para alterar dados (comandos) e ler dados (consultas).
A maioria dos sistemas usa um modelo para leituras e escritas. CQRS os separa deliberadamente: comandos que mutam estado passam por um caminho e modelo, e consultas que leem estado passam por outro, muitas vezes otimizado de forma diferente. Ele pode simplificar drasticamente domínios complexos, mas adiciona partes móveis que aparecem em testes e deploy.
Comandos e consultas separados
Um comando expressa a intenção de alterar estado e retorna pouco ou nada. Uma consulta lê estado e não altera nada. CQRS dá a cada um o próprio modelo, então o lado de escrita pode impor regras de negócio enquanto o lado de leitura é moldado puramente para recuperação rápida.
Por que separá-los
- Cargas de leitura e escrita podem escalar de forma independente.
- Read models podem ser desnormalizados para consultas rápidas.
- O modelo de escrita pode focar em invariantes e validação.
- Combina naturalmente com event sourcing.
O custo da consistência
Quando o read model é atualizado a partir do lado de escrita de forma assíncrona, os dois podem ficar brevemente dessincronizados. Essa consistência eventual precisa ser projetada e exposta aos usuários, e é uma fonte frequente de falhas de teste confusas se não for tratada deliberadamente.
Testando dois modelos
CQRS significa mais a testar: command handlers e suas invariantes, query handlers e suas projeções, e a propagação que mantém o read model atualizado. Testes de integração precisam levar em conta o lag entre uma escrita e o read model refleti-la.
Fazendo deploy dos lados de leitura e escrita
Como os dois lados são separados, eles podem ser deployados e escalados de forma independente, mas uma mudança nos eventos ou projeções que alimentam o read model precisa permanecer compatível, ou você reconstrói projeções durante o deploy.
Quando não usar
CQRS é overhead para CRUD simples. Recorra a ele quando as necessidades de leitura e escrita genuinamente divergem, ou quando o domínio é complexo o bastante para que um modelo compartilhado vire um emaranhado. Do contrário, os pipelines e testes extras não valem a pena.
Principais conclusões
- CQRS usa modelos separados para comandos (escritas) e consultas (leituras).
- Ele permite escala independente e read models otimizados ao custo de consistência eventual.
- É overhead para CRUD simples e compensa principalmente em domínios complexos.