Date post: | 14-Apr-2017 |
Category: |
Software |
Upload: | guilherme-ferreira |
View: | 104 times |
Download: | 5 times |
Como construir software altamente eficiente com
CQRSGuilherme Ferreira
http://netponto.org12ª Reunião Presencial no Porto 17/09/2016
Guilherme Ferreira• http://gsferreira.com• @gsferreira
CQRSCommand Query Responsibility Segregation
Disclaimer
CQRS CommandQuery
Event SourcingAsync Processing
MessagingCache
Queue
Service BusTask Oriented
Eventual Consistency
Novo projeto!
Data Layer
Business Layer
Service Layer
Presentation Layer
DB
Command–query separation (CQS)• Eiffel por Bertrand Meyer• “… asking a question should not change the answer…”
CQS na prática
Altera o estado
Retorna um valor sem ter impactos no
estado
CQS na prática
CQRS é…• Abordagem• Conjunto de práticas comuns
• Domínio Colaborativo• Single Responsibility• Workload Managment• Mais leituras do que escritas
• Software de fácil manutenção a longo prazo• Eficiência!
CQRS não é…• Um padrão• Uma receita• “Don’t write a CQRS framework” by Greg Young
CQRS = CQS em grande escala
CQRS CommandQuery
Event SourcingAsync Processing
MessagingCache
Queue
Service BusTask Oriented
Eventual Consistency
Query Side
Layered Architecture
Data Layer
Business Layer
Service Layer
Presentation Layer
DB
Com
man
d
Que
ry
KISSKeep It Simple, Stupid
“Simple code is fast code” Udi Dahan
Layered Architecture
View Model Data Layer
Business Layer
Service Layer
DB
Presentation Layer
Com
man
d
Que
ry
Base de Dados• “Transações ACID são para bases de dados e não para sistemas” by
Paulo Gandra de Sousa• 3ª Forma Normal• Mas as Listagens não estão na 3FN
• ORM• Será mesmo preciso?
Base de Dados• View Model• Tabelas simples, desnormalizadas• O mundo não é só SQL• Single source of truth is dead• Cache• Cache de Entidades vs Cache de Views
Eventual Consistency• Dados não precisam de ser consistentes em todos os momentos• Eventual Consistency !== Dados errados• Stale data/Dados antigos• Dados datados
Query Side: Resumindo…• Não precisas de muito para começar• Keep it Simple• É uma cache e não uma BD
Command Side
O que são Comandos?• Regista a intenção do utilizador• Nome no imperativo• Pré-validação• Business Rules• Taxa de sucesso elevada• Gere o Domain Model
Task Based UI• Utilizadores não pensam em “modo CRUD”• Captura a intenção do utilizador• Uma página = Uma tarefa principal
Task Based UI
Processamento assíncrono• Separar a receção do comando do seu tratamento• Gestão de workload• Queue / Service Bus
Comandos: Resumindo• Registam a intenção do utilizador• Elevada taxa de sucesso• Task Based UI• Impactos no negócio
Event Sourcing
O que é o Event Sourcing?• O que mudou e quando mudou• Nomes no passado• Não há deletes• View Model atualizado por eventos • Eventos gerados pelos comandos• Por oposição a Cache Invalidation
• Permite reprocessamento/playing back
Eventos
Workshop Created
Price Added
Location Added
Workshop
Published
Event Sourcing Architecture
View Model Data Layer
Business Layer
Service Layer
DB
Presentation Layer
Com
man
d
Que
ry
Cache EventHandlers
Event Sourcing: Resumindo…• O que aconteceu e quando aconteceu• Permite um Audit Trail de tudo o que aconteceu no sistema• Atualiza o View Model
Overengineering?
Bounded Contexts• Dividir um grande sistema em pequenas partes• Domain Model independente• Comunica com outros Bounded Contexts através de Eventos• CQRS só nos Bounded Contexts em que precisas• Não te lembra nada?• Micro Serviços
Resumindo…1. Keep It Simple, start simple.2. Escolhe um Domínio Colaborativo• CQRS não é “Tudo ou Nada”
3. Separa as Queries dos Comandos4. Simplifica o teu Query Side
Resumindo…5. Implementa uma Base de Dados para o teu View Model6. Captura a intenção do teu utilizador7. Gere a carga de trabalho com processamento assíncrono8. Implementa Event Sourcing9. Evangeliza o negócio
Questões?
@gsferreirahttps://gsferreira.com
Patrocinadores “GOLD”
Patrocinadores “Bronze”
http://bit.ly/netponto-aval-po-12
* Para quem não puder preencher durante a reunião, iremos enviar um email com o link à tarde