VapVup👤
← Voltar

CQRS: Command Query Responsibility Segregation

CQRS é um padrão que separa as operações de leitura (Query) das operações de escrita (Command) em modelos diferentes. Isso permite otimizar cada lado de forma independente.

🍽️Analogia

O Restaurante: Garçom vs Cozinheiro

Imagine um restaurante: o garçom anota pedidos e traz informações do cardápio (Query), enquanto o cozinheiro prepara os pratos (Command). Cada um tem sua especialidade e trabalha de forma independente. Se o restaurante lota, você pode contratar mais garçons sem precisar de mais cozinheiros.

💡Conceito

Separação de Leitura e Escrita

No CQRS, o modelo de leitura é otimizado para consultas rápidas, enquanto o modelo de escrita garante consistência e validações de negócio. Eles podem usar bancos de dados diferentes e escalar independentemente.

💡Conceito

Modelos Independentes

O modelo de Command valida regras de negócio e persiste mudanças. O modelo de Query é uma projeção desnormalizada, feita sob medida para o que a tela precisa mostrar.

🔧Exemplo

E-commerce com Read Model Otimizado

Em um e-commerce, o Command cria pedidos validando estoque e pagamento. O Query retorna uma view desnormalizada com nome do produto, preço e status — tudo pronto para exibir sem JOINs pesados.

// Command: criar pedido
class CriarPedidoCommand {
  produtoId: string;
  quantidade: number;
  clienteId: string;
}

// Query: read model otimizado
interface PedidoView {
  pedidoId: string;
  nomeCliente: string;
  nomeProduto: string;
  valorTotal: number;
  status: string;
}
📋Analogia

Quadro de Avisos vs Caixa de Sugestões

O quadro de avisos é a Query: todo mundo lê, precisa ser claro e rápido de consultar. A caixa de sugestões é o Command: você escreve algo que será processado depois, com calma e validação.

💡Conceito

Escalabilidade com CQRS

Como leituras geralmente superam escritas (proporção de 90/10 é comum), você pode escalar o lado de Query com réplicas de leitura e cache agressivo, sem impactar a performance das escritas.