SlideShare uma empresa Scribd logo
1 de 15
Baixar para ler offline
CQRS
Marcelo Serpa
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
CQS - tudo começou com Meyer
Bertrand Meyer
Linguagem Eiffel
Autor do livro Object-Oriented Software Construction
Design by Contract
Command Query Separation
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.
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
}
}
CQRS
Greg Young
Command Query Responsability Segregation
Definindo como uma extensão do CQS
Diferença: Command e Queries são
separados em objetos
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
}
}
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.”
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.
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
Banco de dados ACID
Mecanismos e padrões
● Primary keys
● Integridade de dados
● Integridade relacional (FK)
● Normalização
“Otimizado para escrita”
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.
CQRS + Event Sourcing = Consistência eventual
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
https://medium.com/@marceloserpa
https://github.com/marceloserpa
https://twitter.com/_marceloserpa

Mais conteúdo relacionado

Semelhante a CQRS e CQS: Entendendo os padrões de projeto para separação de comandos e consultas

Bancos de dados open source
Bancos de dados open sourceBancos de dados open source
Bancos de dados open sourceRodrigo Aurélio
 
Arquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depoisArquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depoisLucas Cavalcanti dos Santos
 
Arquitetura Funcional em Microservices
Arquitetura Funcional em MicroservicesArquitetura Funcional em Microservices
Arquitetura Funcional em MicroservicesNubank
 
Machine Learning: Do Notebook ao modelo em produção
Machine Learning: Do Notebook ao modelo em produçãoMachine Learning: Do Notebook ao modelo em produção
Machine Learning: Do Notebook ao modelo em produçãoMarlesson Santana
 
Replicacao Object Sistemas
Replicacao Object SistemasReplicacao Object Sistemas
Replicacao Object Sistemastaniamaciel
 
Uma breve introdução ao Terraform
Uma breve introdução ao TerraformUma breve introdução ao Terraform
Uma breve introdução ao TerraformLeandro Silva
 
Solisc2009 Migrando de Oracle para Postgresql
Solisc2009 Migrando de Oracle para PostgresqlSolisc2009 Migrando de Oracle para Postgresql
Solisc2009 Migrando de Oracle para PostgresqlLeonardo Medeiros Martins
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Renato Groff
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_jsgustavobeavis
 
Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stackSidney Roberto
 
Oracle para PostgreSQL: Conseguir migrar e não parar UTI
Oracle para PostgreSQL: Conseguir migrar e não parar UTIOracle para PostgreSQL: Conseguir migrar e não parar UTI
Oracle para PostgreSQL: Conseguir migrar e não parar UTIFernando Ike
 
SQLCLR - Transformando seu SQL Server em algo muito além de um banco de dados
SQLCLR - Transformando seu SQL Server em algo muito além de um banco de dadosSQLCLR - Transformando seu SQL Server em algo muito além de um banco de dados
SQLCLR - Transformando seu SQL Server em algo muito além de um banco de dadosDirceu Resende
 

Semelhante a CQRS e CQS: Entendendo os padrões de projeto para separação de comandos e consultas (20)

Bancos de dados open source
Bancos de dados open sourceBancos de dados open source
Bancos de dados open source
 
NoSql e NewSql
NoSql e NewSqlNoSql e NewSql
NoSql e NewSql
 
Arquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depoisArquitetura funcional em microservices, 4 anos depois
Arquitetura funcional em microservices, 4 anos depois
 
NOSQL - Uma real alternativa
NOSQL - Uma real alternativaNOSQL - Uma real alternativa
NOSQL - Uma real alternativa
 
Arquitetura Funcional em Microservices
Arquitetura Funcional em MicroservicesArquitetura Funcional em Microservices
Arquitetura Funcional em Microservices
 
Machine Learning: Do Notebook ao modelo em produção
Machine Learning: Do Notebook ao modelo em produçãoMachine Learning: Do Notebook ao modelo em produção
Machine Learning: Do Notebook ao modelo em produção
 
Aula1
Aula1Aula1
Aula1
 
Introdução Play framework
Introdução Play frameworkIntrodução Play framework
Introdução Play framework
 
Replicacao Object Sistemas
Replicacao Object SistemasReplicacao Object Sistemas
Replicacao Object Sistemas
 
Uma breve introdução ao Terraform
Uma breve introdução ao TerraformUma breve introdução ao Terraform
Uma breve introdução ao Terraform
 
Solisc2009 Migrando de Oracle para Postgresql
Solisc2009 Migrando de Oracle para PostgresqlSolisc2009 Migrando de Oracle para Postgresql
Solisc2009 Migrando de Oracle para Postgresql
 
Cloudformation
CloudformationCloudformation
Cloudformation
 
Behaviour-Driven Development com Ruby
Behaviour-Driven Development com RubyBehaviour-Driven Development com Ruby
Behaviour-Driven Development com Ruby
 
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017Mocks, Stubs e Fakes - Developers-SP - Julho-2017
Mocks, Stubs e Fakes - Developers-SP - Julho-2017
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_js
 
Web Scale Data Management
Web Scale Data ManagementWeb Scale Data Management
Web Scale Data Management
 
Padrões MVC
Padrões MVCPadrões MVC
Padrões MVC
 
Precisamos falar sobre MERN stack
Precisamos falar sobre MERN stackPrecisamos falar sobre MERN stack
Precisamos falar sobre MERN stack
 
Oracle para PostgreSQL: Conseguir migrar e não parar UTI
Oracle para PostgreSQL: Conseguir migrar e não parar UTIOracle para PostgreSQL: Conseguir migrar e não parar UTI
Oracle para PostgreSQL: Conseguir migrar e não parar UTI
 
SQLCLR - Transformando seu SQL Server em algo muito além de um banco de dados
SQLCLR - Transformando seu SQL Server em algo muito além de um banco de dadosSQLCLR - Transformando seu SQL Server em algo muito além de um banco de dados
SQLCLR - Transformando seu SQL Server em algo muito além de um banco de dados
 

Mais de Marcelo Serpa

Web 3.0 - The Future of Web
Web 3.0 - The Future of WebWeb 3.0 - The Future of Web
Web 3.0 - The Future of WebMarcelo Serpa
 
Frontend Track NodeJS
Frontend Track NodeJSFrontend Track NodeJS
Frontend Track NodeJSMarcelo Serpa
 
Defenda seus consumidores
Defenda seus consumidoresDefenda seus consumidores
Defenda seus consumidoresMarcelo Serpa
 
Service discovery with Eureka and Spring Cloud
Service discovery with Eureka and Spring CloudService discovery with Eureka and Spring Cloud
Service discovery with Eureka and Spring CloudMarcelo Serpa
 
Acessando apis com feign e hystrix
Acessando apis com feign e hystrixAcessando apis com feign e hystrix
Acessando apis com feign e hystrixMarcelo Serpa
 
No core do node js - entendendo como a plataforma trabalha
No core do node js  - entendendo como a plataforma trabalhaNo core do node js  - entendendo como a plataforma trabalha
No core do node js - entendendo como a plataforma trabalhaMarcelo Serpa
 
Componentizacao com ReactJs
Componentizacao com ReactJsComponentizacao com ReactJs
Componentizacao com ReactJsMarcelo Serpa
 

Mais de Marcelo Serpa (13)

AWS Organizations
AWS OrganizationsAWS Organizations
AWS Organizations
 
Web 3.0 - The Future of Web
Web 3.0 - The Future of WebWeb 3.0 - The Future of Web
Web 3.0 - The Future of Web
 
Frontend Track NodeJS
Frontend Track NodeJSFrontend Track NodeJS
Frontend Track NodeJS
 
Netty training
Netty trainingNetty training
Netty training
 
Terraform
TerraformTerraform
Terraform
 
Microservices
MicroservicesMicroservices
Microservices
 
Caching
CachingCaching
Caching
 
Defenda seus consumidores
Defenda seus consumidoresDefenda seus consumidores
Defenda seus consumidores
 
Service discovery with Eureka and Spring Cloud
Service discovery with Eureka and Spring CloudService discovery with Eureka and Spring Cloud
Service discovery with Eureka and Spring Cloud
 
Acessando apis com feign e hystrix
Acessando apis com feign e hystrixAcessando apis com feign e hystrix
Acessando apis com feign e hystrix
 
No core do node js - entendendo como a plataforma trabalha
No core do node js  - entendendo como a plataforma trabalhaNo core do node js  - entendendo como a plataforma trabalha
No core do node js - entendendo como a plataforma trabalha
 
Componentizacao com ReactJs
Componentizacao com ReactJsComponentizacao com ReactJs
Componentizacao com ReactJs
 
Clean code
Clean codeClean code
Clean code
 

Último

Apresentação Manutenção Total Produtiva - TPM
Apresentação Manutenção Total Produtiva - TPMApresentação Manutenção Total Produtiva - TPM
Apresentação Manutenção Total Produtiva - TPMdiminutcasamentos
 
apresentação de Bancos de Capacitores aula
apresentação de Bancos de Capacitores aulaapresentação de Bancos de Capacitores aula
apresentação de Bancos de Capacitores aulaWilliamCruz402522
 
07 - MICRÔMETRO EXTERNO SISTEMA MÉTRICO.pptx
07 - MICRÔMETRO EXTERNO SISTEMA MÉTRICO.pptx07 - MICRÔMETRO EXTERNO SISTEMA MÉTRICO.pptx
07 - MICRÔMETRO EXTERNO SISTEMA MÉTRICO.pptxVagner Soares da Costa
 
Lista de presença treinamento de EPI NR-06
Lista de presença treinamento de EPI NR-06Lista de presença treinamento de EPI NR-06
Lista de presença treinamento de EPI NR-06AndressaTenreiro
 
NR10 - Treinamento LOTO - 2023.pp tx
NR10 - Treinamento LOTO - 2023.pp     txNR10 - Treinamento LOTO - 2023.pp     tx
NR10 - Treinamento LOTO - 2023.pp txrafaelacushman21
 
10 - RELOGIO COMPARADOR - OPERAÇÃO E LEITURA.pptx
10 - RELOGIO COMPARADOR - OPERAÇÃO E LEITURA.pptx10 - RELOGIO COMPARADOR - OPERAÇÃO E LEITURA.pptx
10 - RELOGIO COMPARADOR - OPERAÇÃO E LEITURA.pptxVagner Soares da Costa
 
TRABALHO INSTALACAO ELETRICA EM EDIFICIO FINAL.docx
TRABALHO INSTALACAO ELETRICA EM EDIFICIO FINAL.docxTRABALHO INSTALACAO ELETRICA EM EDIFICIO FINAL.docx
TRABALHO INSTALACAO ELETRICA EM EDIFICIO FINAL.docxFlvioDadinhoNNhamizi
 

Último (7)

Apresentação Manutenção Total Produtiva - TPM
Apresentação Manutenção Total Produtiva - TPMApresentação Manutenção Total Produtiva - TPM
Apresentação Manutenção Total Produtiva - TPM
 
apresentação de Bancos de Capacitores aula
apresentação de Bancos de Capacitores aulaapresentação de Bancos de Capacitores aula
apresentação de Bancos de Capacitores aula
 
07 - MICRÔMETRO EXTERNO SISTEMA MÉTRICO.pptx
07 - MICRÔMETRO EXTERNO SISTEMA MÉTRICO.pptx07 - MICRÔMETRO EXTERNO SISTEMA MÉTRICO.pptx
07 - MICRÔMETRO EXTERNO SISTEMA MÉTRICO.pptx
 
Lista de presença treinamento de EPI NR-06
Lista de presença treinamento de EPI NR-06Lista de presença treinamento de EPI NR-06
Lista de presença treinamento de EPI NR-06
 
NR10 - Treinamento LOTO - 2023.pp tx
NR10 - Treinamento LOTO - 2023.pp     txNR10 - Treinamento LOTO - 2023.pp     tx
NR10 - Treinamento LOTO - 2023.pp tx
 
10 - RELOGIO COMPARADOR - OPERAÇÃO E LEITURA.pptx
10 - RELOGIO COMPARADOR - OPERAÇÃO E LEITURA.pptx10 - RELOGIO COMPARADOR - OPERAÇÃO E LEITURA.pptx
10 - RELOGIO COMPARADOR - OPERAÇÃO E LEITURA.pptx
 
TRABALHO INSTALACAO ELETRICA EM EDIFICIO FINAL.docx
TRABALHO INSTALACAO ELETRICA EM EDIFICIO FINAL.docxTRABALHO INSTALACAO ELETRICA EM EDIFICIO FINAL.docx
TRABALHO INSTALACAO ELETRICA EM EDIFICIO FINAL.docx
 

CQRS e CQS: Entendendo os padrões de projeto para separação de comandos e consultas

  • 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.
  • 13. CQRS + Event Sourcing = Consistência eventual
  • 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