610 likes | 749 Views
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.
E N D
Rethinkyourarchitecturewith CQRS Pieter Joost van de Sande Passionated software developer, Atos Email: pj@born2code.net @twitter: pjvds
Architecture Presentation Domain Data
Presentation Why do we love it? Domain Data
model Domain Driven Design Eric Evans - 2003
Structured models are always created from a single viewpoint!
A model can only be optimized for one thing… and one thing only!
Request data Update screen Send update Presentation layer Request DTO Send DTO Map DTO Map DTO Domain layer RequestDTO RequestDTO Send DTO Send DTO Map DTO Map DTO Map DTO Map DTO Data layer Query data Query data Query data Query data Write data Write data Write data Write data
From 3-tier to CQRS Presentation layer Domain layer Data layer
Just re-order the tiers Presentation layer Data layer Domain layer
Switch dependency Presentation layer Data layer Domain layer
CQRS! Presentation layer Command side Query side Data layer Domain layer
Here we go! From concept toArchitecturE
Read side User interface
SELECT CCUS.CUST_FIRST_NAME , CCUS.CUST_LAST_NAME , CINT.CUST_INTEREST_RANK , CILO.CUST_INTERST FROM CUST_CUSTOMER AS CCUS , CUST_INTEREST_LOOKUP AS CILO , CUST_INTEREST AS CINT WHERE ( 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!
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 Bottom line
Read side User interface
Read side Read databases User interface
Read side Read databases Facade User interface
Read side Read databases Facade DTO’s User interface
Read side Write side Read databases Facade DTO’s User interface
Read side Write side Read databases Facade Commandhandlers commands DTO’s User interface
Commands • Simple messagecontainsall info needed • Lowercoupling (law of demeter) • Causesa state transition • Contains the intend of the user • Exists in a bounded context • Examples: • AddProductToShoppingCart • PurchaseOrder • MoveUserToNewAddress • CorrectAddressForUser • FinalizeOrder
Users don’t make changes for nothing This intent has value! Change has intent Correct the address for user X Customer X moved to new address VS.
Read side Write side Read databases Facade Commandhandlers commands DTO’s User interface
Read side Write side Read databases Repository Facade Domein Commandhandlers commands DTO’s User interface
Events • Simple message that describes an event • Contains intent • Contains all the data related to the event • Past tense CustomerMoved { CustomerId, NewAddress }