DEV Community

CarlosEduardo
CarlosEduardo

Posted on

O que é e para que serve CQRS

O Comand Query Responsability Segregation (Separação das Operações de Comando e de Consulta, em português), como dito por Greg Young, é um padrão onde ocorre a criação de dois modelos que previamente era um. Essa separação ocorre em contextos em que os métodos podem ser comandos (onde há escrita) ou leitura (consultas).

Exemplo

Considere o seguinte serviço e seus métodos:

CustomerService

void MakeCustomerPreferred(CustomerId)
Customer GetCustomer(CustomerId)
CustomerSet GetCustomersWithName(Name)
CustomerSet GetPreferredCustomers()
void ChangeCustomerLocale(CustomerId, NewLocale)
void CreateCustomer(Customer)
void EditCustomerDetails(CustomerDetails)
Enter fullscreen mode Exit fullscreen mode

Ao aplicar o padrão CQRS teríamos dois modelos diferentes:

CustomerWriteService

void MakeCustomerPreferred(CustomerId)
void ChangeCustomerLocale(CustomerId, NewLocale)
void CreateCustomer(Customer)
void EditCustomerDetails(CustomerDetails)
Enter fullscreen mode Exit fullscreen mode
CustomerReadService

Customer GetCustomer(CustomerId)
CustomerSet GetCustomersWithName(Name)
CustomerSet GetPreferredCustomers()
Enter fullscreen mode Exit fullscreen mode

Ao dividir o modelo original do serviço Customer utilizando o padrão CQRS obtém-se dois novos modelos: CustomerWriteService e CustomerReadService. O modelo CustomerWriteService é responsável por alocar os comandos da aplicação, ou seja, funções que podem causar mutação na base de dados. Já o modelo CustomerReadService serve apenas para fazer consultas a base de dados. Note que ao empregar esse padrão, os modelos podem compartilhar uma mesma instância de banco de dados ou ter um próprio.

Vantagem

Ao aplicar o padrão CQRS muitas abordagens podem ser empregadas. Por exemplo em sistemas onde a maior parte de suas operações são de leitura ao invés de escrita, pode-se alocar mais recurso de processamento para lidar com as consultas da aplicação, eliminando concorrência entre escrita e leitura.

Em aplicações o mesmo dado pode ter diversas apresentações, dependendo do contexto em que o usuário está. Com a criação de diferentes modelos pode-se criar uma representação para cada situação, evitando que um único modelo cresça muito e fique complexo.

Desvantagem

A maioria dos sistemas não necessitam de fato da aplicação do padrão CQRS o que poderia simplesmente apenas trazer mais complexidade a aplicação.
Sistemas que utilizam da implementação de CQRS e possuem diferentes instâncias de banco de dados para seus modelos, precisa-se preocupar com Eventual Consistency pois torna-se necessária a garantia de consistência entre os bancos de escrita e leitura.

Considerações finais

O padrão CQRS pode fazer com que a performance de uma aplicação aumente consideravelmente ao criarmos diferentes modelos para leitura e escrita de uma aplicação. Entretanto, sua implementação deve ser bem analisada e ponderada se os ganhos serão mais vantajosos do que a complexidade trazida, como por exemplo a necessidade de garantia de consistência entre diferentes bancos de dados.

Top comments (0)