Rethink your architecture with CQRS

Post on 16-Feb-2016

44 views 0 download

description

Rethink your architecture with CQRS. Pieter Joost van de Sande Passionated software developer , Atos. E mail: pj@born2code.net @ twitter : pjvds. This is meant to be a take away!. Architecture. Architecture. Presentation. Domain. Data. Presentation. Why do we love it?. Domain. - PowerPoint PPT Presentation

Transcript of Rethink your architecture with CQRS

Rethink your architecturewith CQRS

Pieter Joost van de SandePassionated software developer, Atos

Email: pj@born2code.net@twitter: pjvds

This is meant to be a take away!

Architecture

Architecture

Presentation

Domain

Data

Presentation

Domain

Data

Why do we love it?

model

Domain Driven DesignEric Evans - 2003

The value of a structured Model

Who believes in this?

Structured models are always created from a single viewpoint!

A model can only be optimized for one thing… and one thing only!

Presentation layer

Data layer

Domain layerSend DTO

Send DTO

Map DTO

Map DTO

Write data Write data

Map DTO

Write data Write data

Send DTO

Request DTO

Map DTO

RequestDTO

Map DTO

Query data Query data

Request data

Map DTO

Query data Query data

RequestDTO

Send updateUpdate screen

TWO FUNDAMENTALS

Information

Transitions

WRITING != READING

From 3-tier to CQRS

Presentation layer

Domain layer

Data layer

Presentation layer

Domain layerData layer

Just re-order the tiers

Presentation layer

Domain layerData layer

Switch dependency

Presentation layer

Domain layerData layer

CQRS!

Query side Command side

FROM CONCEPT TO ARCHITECTURE

HERE WE GO!

User interface

Demand for information

User interface

Read side

We read a lot

We have multiple screens to fill

Data should be close to us

Relational databases are sub optimal for view data!

SELECT CCUS.CUST_FIRST_NAME , CCUS.CUST_LAST_NAME , CINT.CUST_INTEREST_RANK , CILO.CUST_INTERSTFROM CUST_CUSTOMER AS CCUS , CUST_INTEREST_LOOKUP AS CILO , CUST_INTEREST AS CINTWHERE ( CCUS.CUST_CITY = 'Singapore' AND CCUS.CUST_PROV_STATE = 'Singapore' AND CCUS.CUST_CODE IN ( SELECT COHE.CUST_CODE FROM CUST_ORDER_HEADER AS COHE , CUST_ORDER_STATUS AS COST WHERE ( COHE.CUST_ORDER_DATE >='2009-01-01 00:00:00.001' AND COST.CUST_ORDER_STATUS IN( 'Shipped', 'Back-ordered', 'In-process' ) AND COHE.CUST_ORDER_STATUS_CODE = COST.CUST_ORDER_STATUS_CODE ) ) AND CCUS.CUST_CODE = CINT.CUST_CODE AND CINT.CUST_INTEREST_CODE = CILO.CUST_INTEREST_CODE )ORDER BY CCUS.CUST_LAST_NAME ASC , CCUS.CUST_FIRST_NAME ASC , CINT.CUST_INTEREST_RANK ASC

Evil execution plan!

Bottom line

• Getting data should be simple – select * from x where y

• Examples:– Get all products of user X– Get total price of all orders of month May

User interface

Read side

Read side

User interface

Read databases

Read side

User interface

Read databases

Facade

Read side

User interface

Facade

Read databases

DTO’s

Demand for change

I want to tell the system something

Read side

User interface

Facade

Read databases

DTO’s

Write side

User interface

Commandhandlers

Read databases

Read side

commands DTO’s

Write side

Facade

Commands• Simple message contains all info needed• Lower coupling (law of demeter)• Causes a state transition• Contains the intend of the user• Exists in a bounded context

• Examples:– AddProductToShoppingCart– PurchaseOrder– MoveUserToNewAddress– CorrectAddressForUser– FinalizeOrder

Commands example

Create Cart

Add item

Add item

Add item

Remove item

Purchase

Users don’t make changes for nothing, intent is important!

Change has intent

• Users don’t make changes for nothing• This intent has value!

Correct the address for

user X

Customer X moved to

new addressVS.

User interface

Commandhandlers

Read databases

Read side

commands DTO’s

Write side

Facade

User interface

Commandhandlers

Read databases

Read side

commands DTO’s

Dom

ein

Write side

Repository

Facade

Event Sourcing

Events

• Simple message that describes an event• Contains intent• Contains all the data related to the event• Past tense

CustomerMoved{

CustomerId,NewAddress

}

Transitional flow

User interface

Commandhandlers

Read databases

Read side

commands DTO’s

Dom

ein

Write side

Repository

Facade

User interface

Commandhandlers

Read databases

Read side

commands DTO’s

Dom

ein

Write side

Repository

Facade

Event store

• Contains all domain events• Does not need to be relational• Write are *awesomely* fast!• Rock solid audit log• Read models can (re)build themself of it• The domain uses it to get the current state

• Can be used to build any structural model you want!

User interface

Commandhandlers

Read databases

Read side

commands DTO’s

Dom

ein

Write side

Repository

?

Facade

User interface

Commandhandlers

Repository

Event bus

Read databases

Write side Read side

eventscommands DTO’s

Dom

ein

Facade

User interface

Commandhandlers

Repository

Event bus

Deno

rmal

izers

Read databases

Write side Read side

events

events events

commands DTO’s

Dom

ein

Facade

Application flow

Wrap up

• Optimize for reading and writing• Makes changes part of the problem domain• Free rock solid audit log• Capture the intent of changes• Allow multiple read models

Thank you!You’ve been a great audience!