O que esconde o CQRS

Introdução

O que é o CQRS (Command Query Responsibility Segregation)? Quais os seus benefícios? Que desafios esconde?

Estas são algumas das questões que este artigo pretende responder, demonstrando que o CQRS parte de um princípio simples e que é capaz de evoluir para dar resposta a problemas mais complexos.

O que é o CQRS?

As origens do CQRS são baseadas no CQS (Command-Query separation), um princípio criado por Bertrand Meyer durante o desenvolvimento da linguagem de programação Eiffel.

Meyer afirma que fazer uma pergunta não deve alterar a sua resposta. Esta é a ideia basilar do CQRS.

Analisando esta afirmação podemos concluir que um comando corresponde a qualquer método que cria, atualiza ou remove dados, e que uma consulta é qualquer método que retorne dados.

É evidente que o CQRS é uma evolução do CQS, elevando o conceito inicial a um novo nível, afirmando que o modelo de leitura e de escrita devem ser distintos. Em suma, CQRS é simplesmente isso, uma separação das duas responsabilidades.

Se olharmos friamente para este princípio, vemos o reflexo de algumas das preocupações que tem surgido no desenvolvimento de software. Desnormalizar a base de dados, utilizar sistemas de cache e utilizar bases de dados otimizadas para consultas, são alguns dos exemplos de que a indústria já se encontra a trabalhar para resolver alguns dos problemas a que o CQRS pretende dar resposta.

Cqrs - Modelo

Muitas vezes o CQRS é apresentado em conjunto com outras técnicas ou peças tecnológicas, como o Event Sourcing ou o NServiceBus, mas nada no CQRS diz que devemos utilizá-los. É importante salientar que estes elementos adicionam um nível adicional de complexidade que deve ser evitado caso não seja necessário.

Benefícios do CQRS

Todos os benefícios aqui apresentados são capacidades que o CQRS fornece, no entanto, estes não são requisitos para a implementação do CQRS.

Consultas mais simples

Com a separação do modelo de leitura, do modelo de escrita, é possível criar consultas mais simples e com melhor desempenho. Quando o modelo de leitura e escrita são partilhados, somos levados a aplicar condicionantes às consultas, devido aos requisitos presentes no modelo de escrita e vice-versa.

O sistema irá assim beneficiar de ter uma camada de leitura mais fina e otimizada. Citando Udi Dahan, Código simples é Código rápido.

Bases de dados separadas

Uma vez que o modelo de leitura está separado, é possível dividir a base de dados, possibilitando consultas a uma base de dados otimizada para leitura.

Esta possibilidade leva a conceitos como Eventual Consitency e Event Sourcing.

Nota: É perfeitamente possível implementar CQRS partilhando a base de dados entre os modelos.

Cqrs - Modelo com duas bases de dados

Fila de trabalho

Ao separar os dois modelos, permitimos que os comandos possam ser processados utilizando uma queue, habilitando um processamento assíncrono do trabalho a executar. Isto pode ser útil para lidar com processamentos complexos ou para gerir a carga no sistema.

Separação da carga

Tipicamente, o número de consultas num sistema é muito superior ao número de comandos realizados. Este facto levanta a questão de porque é que tipicamente se utiliza as mesmas tecnologias e padrões para responder a consultas e a escritas?!

O CQRS permite a separação da carga, com possibilidade de utilizar servidores diferentes para cada parte do sistema. Por exemplo, podemos perfeitamente utilizar tecnologias completamente distintas para leitura e escrita.

Desafios

O CQRS não é apenas uma lista de benefícios. Diria que o seu maior desafio reside na complexidade inerente à sua implementação.

É também importante salientar que a sua implementação implica uma visão/abordagem diferente. Habitualmente estamos formatados para pensar em operações CRUD, mas com o CQRS somos levados a pensar em tarefas/comandos, o que tem implicações não só a nível das operações bem como no desenho da interface da aplicação.

Conclusão

CQRS não se aplica a todos os casos e não é uma receita que se deva seguir cegamente. No entanto é uma ferramenta que pode ser extremamente útil no momento de lidar com alguns problemas de elevada complexidade.

É importante relembrar que se deve começar simples e que aplicando o CQRS será sempre possível evoluir de modo a dar respostas a problemas mais complexos.