Skip to content
Latchkey

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.

Guias relacionados