Padrão CQRS

Entenda o padrão arquitetural CQRS (Command Query Responsibility Segregation), que separa operações de leitura e gravação em um sistema para melhor desempenho, escalabilidade e manutenção.

O que é

O padrão CQRS (Command Query Responsibility Segregation) é uma abordagem arquitetural que separa as operações de leitura e gravação em um sistema, permitindo a otimização independente de cada aspecto. Este modelo, introduzido por Greg Young, visa melhorar o desempenho, a escalabilidade e a manutenção de aplicações complexas.

Separação conceitual

No modelo tradicional (CRUD), usamos o mesmo modelo de entidade para ler e escrever:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// Modelo único — usado tanto para leitura quanto para escrita
@Entity
public class Cliente {
    @Id private Long id;
    private String nome;
    private String email;
    private String telefone;
    private LocalDate dataCadastro;
    // 10+ campos...
}

No CQRS, separamos em dois modelos distintos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// COMMAND — usado apenas para escrever
public class CriarClienteCommand {
    private String nome;
    private String email;
    private String telefone;
}

// QUERY — modelo otimizado para leitura (pode ser uma projeção)
public class ClienteResumoDTO {
    private Long id;
    private String nome;
    // apenas os campos necessários para a view
}

Exemplo prático com Spring

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// Command (escrita)
@Service
public class ClienteCommandHandler {
    @Autowired
    private ClienteRepository repository;

    public void handle(CriarClienteCommand cmd) {
        var cliente = new Cliente(cmd.nome(), cmd.email(), cmd.telefone());
        repository.save(cliente);
    }
}

// Query (leitura) — pode usar uma projeção JPA
public interface ClienteQueryRepository extends JpaRepository<Cliente, Long> {
    // Projeção fechada — busca apenas os campos necessários
    <T> List<T> findByOrderByNome(Class<T> projection);
}

Cenários onde aplicar o CQRS

O padrão CQRS é uma abordagem arquitetural que pode trazer benefícios em cenários específicos e agregar complexidade em outros. Em geral ele traz benefícios em Sistemas de Alta Performance, pois permite otimizar o fluxo de leitura e escrita da melhor forma, inclusive a nível de banco de dados.

Não há uma única forma de aplicar ou biblioteca mágica que irá abstrair toda a complexidade. Optar por CQRS irá exigir uma correta modelagem tanto do cenário de leitura quanto de escrita e a revisão contínua dessa abordagem. Este padrão não exige aplicação em todos os domínios, então pode ser aplicado nos pontos que mais irão render benefícios, como performance ou organização da arquitetura.

Conclusão

O CQRS é um padrão poderoso para cenários onde leitura e escrita têm requisitos significativamente diferentes. Não é recomendado para CRUDs simples — a complexidade adicional só se justifica quando há ganhos reais de performance, escalabilidade ou organização.

Aprofunde seus conhecimentos:

Se você chegou até aqui e ficou curioso com este padrão, recomendo estes artigos que irão agregar mais conhecimento para que você possa de fato aplicar os conceitos:

comments powered by Disqus
Criado com Hugo
Tema Stack desenvolvido por Jimmy