Como construir software altamente eficiente com CQRS

Post on 14-Apr-2017

106 views 5 download

Transcript of Como construir software altamente eficiente com CQRS

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 “Silver”

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