O documento apresenta os conceitos de CQRS e CQS. CQS separa comandos (que mutam estado) de consultas (que não mutam estado) em objetos. CQRS estende esse princípio separando comandos e consultas em serviços distintos. Aplicar CQRS permite modelar leitura e escrita de forma independente e usar bancos de dados otimizados para cada operação, melhorando performance e escalabilidade.
2. Olá, eu sou Marcelo
Desenvolvedor de software na Ilegra
Microservices / Java8
Formado no curso de ADS na FTEC
Apaixonado por desenvolvimento de software
Tenho interesse em Design de Software e Cloud Native
Além de programação, gosto de card games
Blog https://medium.com/@marceloserpa
Github https://github.com/marceloserpa
Twitter https://twitter.com/_marceloserpa
3. CQS - tudo começou com Meyer
Bertrand Meyer
Linguagem Eiffel
Autor do livro Object-Oriented Software Construction
Design by Contract
Command Query Separation
4. CQS
Commands operações que realizam alguma mutação no estado de um
objeto. Não devem retornar nenhum resultado.
Queries operações de leitura do estado, esse tipo de operação não deve
realizar nenhum tipo de mutação sendo assim livre de side-effects.
5. Exemplo de uma classe aplicando CQS
public class ProdutoService {
public void salvar(Produto produto){
// realizar alguma mutação de estado
}
public Optional<Produto> buscarPeloID(Long id){
// consulta algum dados
}
public Produto editar(Produto produto){
// PROBLEMA: realiza uma mutação e ainda retorna um valor
}
}
6. CQRS
Greg Young
Command Query Responsability Segregation
Definindo como uma extensão do CQS
Diferença: Command e Queries são
separados em objetos
7. Exemplo Aplicando CQRS
public class ProdutoCommandService {
public void salvar(Produto produto){
// realizar alguma mutação de estado
}
}
public class ProdutoQueryService {
public Produto consultarPeloNome(String termo){
// pesquisa dados
}
}
8. Segundo Greg Young
“O padrão, embora não seja muito interessante em si, torna-se extremamente
interessante quando visto de um ponto de vista arquitetural.”
9. Falando um pouco sobre CRUDs...
Modelo de domínio iguais para
leitura e escrita
Necessidades diferentes entre
modelos ( Exemplo: Validação )
Estrutura de armazenamento de
dados iguais.
10. Aplicando CQRS
Command
- Representa uma tarefa
- Muta o estado de algum dado
- Realiza validações
- Executa regra de negócio
- Não expõe o estado interno
Query
- Recupera os dados
- Modela de acordo com a necessidade
de representação
11. Banco de dados ACID
Mecanismos e padrões
● Primary keys
● Integridade de dados
● Integridade relacional (FK)
● Normalização
“Otimizado para escrita”
12. Problemas de escalidade e o teorema CAP
Considerando um ambiente distribuído.
Consistência: garantia de leitura do dado mais
recente.
(A) Disponibilidade: sempre entrega o dado
para o usuário
Tolerância a (P)articionamento: banco de
dados distribuído com replicação.
14. Prós
● Possibilita modelar de forma
independente a escrita da leitura
● Utilizar o banco mais otimizado para
cada tarefa
● Performance as duas operações
● Escalabilidade
Contras
● Aumenta a complexidade do sistema
● Deve ser usado em cenários específicos
● Pode levantar questões em relação a
consistência eventual