Command Query Responsibility Segregation (CQRS)

Command Query Responsibility Segregation (CQRS) é uma abordagem para desenvolvimento de software onde desenvolvemos estruturas de dados distintas para gravação (comandos) e para a leitura (consultas). CQRS não prescreve, explicitamente, a adoção de eventos. Entretanto, é comum utilizar, com CQRS, algum padrão de notificação por eventos ou até event sourcing.

Greg Young, responsável pelas formalizações de CQRS e Event Sourcing, costuma indicar a adoção conjunta das duas técnicas.

Geralmente, a implementação das consultas (query-side) costuma ser mais simples. Afinal, validações e outras complexidades do domínio costumam ficar restritas às operações que causam modificações persistentes de estado (command-side).  

O “afrouxamento” da implementação das consultas permite a redução da quantidade de dados trafegando na rede.

Temos encontrado, com frequência, implementações REST-like que fazem trafegar na rede estruturas complexas de dados que são utilizadas apenas parcialmente. A justificativa é continuar utilizando os mesmos modelos definidos no domínio. Resultado? Telas de consulta que relacionam nomes e telefones de clientes mas que são abastecidas por JSONs gigantescos que oneram a rede e os custos de serialização e desserialização.

CQRS ajuda na definição de abstrações eficientes.

Outra característica recorrente de implementações de CQRS são interfaces com o usuário que evidenciam operações de negócio (domínio) no lugar de simples manipulações de dados. Em termos simples, o padrão CQRS não costuma ser utilizado com implementações tradicionais de CRUD.

É possível conceber um sistema com comandos como CreateEmployee, UpdateEmployee, etc. Entretanto, consideramos que a complexidade adicionada pelo padrão, nesses casos, acaba não se justificando.

Um bom modelo com CQRS deveria permitir a definição de comandos como RegisterEmployee, UpdateEmployeeAddress, RegisterEmployeePromotion, etc. Sendo que, comandos assim, obviamente implicariam em um design de interação mais rico do que aqueles que temos visto frequentemente (muito mais ajustado, inclusive, para utilização em dispositivos móveis) e modelados a partir de uma compreensão mais rigorosa do domínio (consideramos difícil desassociar CQRS de DDD).

Implementações de CQRS com comandos com “mais significado” facilitam o “enfileiramento” de mensagens empregando alguma técnica de mensageira.

Embora não seja um imperativo, é comum que implementações CQRS utilizem fontes de dados distintas. Nesses casos, é comum utilizar notificação por eventos (que carregam dados relacionados) para orquestrar a consistência entre as bases.

Greg Young destaca que uma base de dados persistindo eventos poderia ser utilizada para a implementação dos comandos e uma base de dados “consolidada” poderia ser utilizada na implementação das consultas.

Mesmo que não sejam utilizadas bases de dados distintas, é importante destacar que caching costuma fazer mais sentido para a implementação das consultas (query-side) do que das gravações (command-side). Nesses casos, notificações por eventos são boas alternativas para implementações de estratégias para invalidação do cache.

 Já implementou software usando CQRS? Como foi sua experiência?

Compartilhe este insight:

Comentários

Participe deixando seu comentário sobre este artigo a seguir:

Subscribe
Notify of
guest
1 Comentário
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Rodrigo de Freitas Oliveira
Rodrigo de Freitas Oliveira
1 ano atrás

Olá. Estou estudando CQRS e gostei muito de sua aula no youtube. Estou com dúvidas sobre eventos e notificações, como enviar um email apos uma operação

AUTOR

Elemar Júnior
Fundador e CEO da EximiaCo atua como tech trusted advisor ajudando empresas e profissionais a gerar mais resultados através da tecnologia.

NOVOS HORIZONTES PARA O SEU NEGÓCIO

Nosso time está preparado para superar junto com você grandes desafios tecnológicos.

Entre em contato e vamos juntos utilizar a tecnologia do jeito certo para gerar mais resultados.

Insights EximiaCo

Confira os conteúdos de negócios e tecnologia desenvolvidos pelos nossos consultores:

Arquivo

Pós-pandemia, trabalho remoto e a retenção dos profissionais de TI

CTO Consulting e Especialista em Execução em TI
1
0
Queremos saber a sua opinião, deixe seu comentáriox
Oferta de pré-venda!

Mentoria em
Arquitetura de Software

Práticas, padrões & técnicas para Arquitetura de Software, de maneira efetiva, com base em cenários reais para profissionais envolvidos no projeto e implantação de software.

Muito obrigado!

Deu tudo certo com seu envio!
Logo entraremos em contato

Command Query Responsibility Segregation (CQRS)

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Command Query Responsibility Segregation (CQRS)

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Condição especial de pré-venda: R$ 14.000,00 - contratando a mentoria até até 31/01/2023 e R$ 15.000,00 - contratando a mentoria a partir de 01/02/2023, em até 12x com taxas.

Tenho interesse nessa capacitação

Para solicitar mais informações sobre essa capacitação para a sua empresa, preencha o formulário a seguir:

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

O seu insight foi excluído com sucesso!

O seu insight foi excluído e não está mais disponível.

O seu insight foi salvo com sucesso!

Ele está na fila de espera, aguardando ser revisado para ter sua publicação programada.

Tenho interesse em conversar

Se você está querendo gerar resultados através da tecnologia, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse nessa solução

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

Tenho interesse neste serviço

Se você está procurando este tipo de solução para o seu negócio, preencha este formulário que um de nossos consultores entrará em contato com você:

× Precisa de ajuda?