© Copyright 2010 Imaginet. All rights reserved. Distributed Architecture Patterns CQRS & Event Sourcing
© Copyright 2010 Imaginet. All rights reserved. Dylan Smith Senior ALM Consultant Application Lifecycle Expert PROFILE Dylan is an ALM (Application Lifecycle Management) consultant for Imaginet where he spends his time helping teams become more successful at delivering software. Dylan has over a decade experience designing and architecting mission critical applications. In the past 5 years Dylan has focused on agile development techniques and practices. He has led the shift to agile and lean development practices across multiple teams, projects and companies. “CQRS+ES differs from most design patterns in that it provides clear business benefits in addition to the obvious technical benefits.”
© Copyright 2010 Imaginet. All rights reserved. Overview Review Typical Architecture What is CQRS? What is Event Sourcing? CODE !!! Benefits / Concerns
© Copyright 2010 Imaginet. All rights reserved. Data Storage Domain Object Application Services Remote Facade Client Request DTO DTO Returned Request DTO DTO Returned Send DTO Status Returned Send DTO Status Returned Repository Domain Object Typical Distributed Architecture
© Copyright 2010 Imaginet. All rights reserved. Data Storage Domain Object Command Handlers Remote Facade Client Request DTO DTO Returned Request DTO DTO Returned Send Command Ack/Nak Response Send Command Ack/Nak Response Repository Domain Object Query Handlers Remote Facade Data Storage CQRS
© Copyright 2010 Imaginet. All rights reserved. Sample Read Data Model
© Copyright 2010 Imaginet. All rights reserved. Purchase Order Line Items (n) Shipping Information
© Copyright 2010 Imaginet. All rights reserved. Order Created Added 4 Hats Added 2 Shirts Shipping Info Added
© Copyright 2010 Imaginet. All rights reserved. Event Store Domain Object Command Handlers Remote Facade Client Request DTO DTO Returned Request DTO DTO Returned Send Command Ack/Nak Response Send Command Ack/Nak Response Repository Domain Object Query Handlers Remote Facade Data Storage Event Bus CQRS + ES Event Handlers
© Copyright 2010 Imaginet. All rights reserved. Event Store Data Model
© Copyright 2010 Imaginet. All rights reserved.
Command
© Copyright 2010 Imaginet. All rights reserved. Event
© Copyright 2010 Imaginet. All rights reserved. Command Handler
© Copyright 2010 Imaginet. All rights reserved. Domain Object
© Copyright 2010 Imaginet. All rights reserved. Event Handler
© Copyright 2010 Imaginet. All rights reserved. Query Handler
© Copyright 2010 Imaginet. All rights reserved. Data Transfer Object
© Copyright 2010 Imaginet. All rights reserved.
vs
© Copyright 2010 Imaginet. All rights reserved. Scalability
© Copyright 2010 Imaginet. All rights reserved.
Sample Unit Test
© Copyright 2010 Imaginet. All rights reserved. Sample Unit Test #2
© Copyright 2010 Imaginet. All rights reserved.
Client Domain Read Model Events Commands DTOs
© Copyright 2010 Imaginet. All rights reserved.
NoSQL Databases
© Copyright 2010 Imaginet. All rights reserved. Other Topics (Time Permitting) Event Versioning When to use CQRS/ES? Using CQRS or ES separately Concurrency Eventual Consistency Asynchronous Commands
© Copyright 2010 Imaginet. All rights reserved. Recommended Reading
© Copyright 2010 Imaginet. All rights reserved. Sample Code Super Simple CQRS Example github.com/gregoryyoung/m-r NCQRS ncqrs.org The CQRS Kitchen thecqrskitchen.codeplex.com Lokad-CQRS code.google.com/p/lokad-cqrs Fohjin github.com/MarkNijhof/Fohjin
© Copyright 2010 Imaginet. All rights reserved. Summary CQRS – Enables specialization: of design/architecture, and people Event Sourcing – All about capturing intent and not losing data
© Copyright 2010 Imaginet. All rights reserved. Questions?