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)
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)
CustomerReadService
Customer GetCustomer(CustomerId)
CustomerSet GetCustomersWithName(Name)
CustomerSet GetPreferredCustomers()
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)