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