CQRS Andriy Drozdyuk

90
this slide left intentionally blank

Transcript of CQRS Andriy Drozdyuk

Page 1: CQRS Andriy Drozdyuk

this slide left intentionally blank

Page 2: CQRS Andriy Drozdyuk

CommandQueryResponsibilitySegregation

Andriy Drozdyuk

Page 3: CQRS Andriy Drozdyuk

Outline

1. Stereotypical Architecture2. Why SA is used3. Task Based UI4. CQRS5. Query Side6. Command Side

Page 4: CQRS Andriy Drozdyuk

Stereotypical Architecture

Page 5: CQRS Andriy Drozdyuk
Page 6: CQRS Andriy Drozdyuk
Page 7: CQRS Andriy Drozdyuk

Why?

Page 8: CQRS Andriy Drozdyuk

Simple

1. Any junior developer can be taught it2. Very generic3. Widely known4. Removes the need to think about architecture

Page 9: CQRS Andriy Drozdyuk

Tooling

1. Frameworks2. ORM3. Mapping utilities

Page 10: CQRS Andriy Drozdyuk

Why Not?

Page 11: CQRS Andriy Drozdyuk

Downsides

1. Impossible to do Domain Driven Design

Page 12: CQRS Andriy Drozdyuk

Data Oriented

Page 13: CQRS Andriy Drozdyuk

Data Oriented

Same

Page 14: CQRS Andriy Drozdyuk

Data Oriented

Same

Create Read

Update Delete

Page 15: CQRS Andriy Drozdyuk

Data Oriented

Same

Create Read

Update Delete

Anemic Domain Model(Martin Fowler)

Page 16: CQRS Andriy Drozdyuk

Anemic Domain Model

[T]here is hardly any behavior on these objects, making them little more than bags of getters and setters. … Instead there are a set of service objects which capture all the domain logic. These services live on top of the domain model and use the domain model for data. (Martin Fowler, 2003)

Page 17: CQRS Andriy Drozdyuk

DO DTO

Page 18: CQRS Andriy Drozdyuk

DO DTO

Get, Set

Page 19: CQRS Andriy Drozdyuk

DO DTO

Get, Set

Business Logic?

Page 20: CQRS Andriy Drozdyuk

DO DTO

Get, Set

Business Logic?Mappers

Page 21: CQRS Andriy Drozdyuk

DO DTO

Get, Set

Business Logic

Business Logic?Mappers

Page 22: CQRS Andriy Drozdyuk

This is far worse than the creation of an anemic model, this is the creation of a glorified excel spreadsheet.-Greg Young

Page 23: CQRS Andriy Drozdyuk

Scaling Characteristics

1. Bottlenecksa. Data storageb. Relational Databases: not horizontal, vertical expensive

2. Most systems don’t need to scale

Page 24: CQRS Andriy Drozdyuk

Task Based UI

Page 25: CQRS Andriy Drozdyuk

Stereotypical Architecture UI

1. Loses “intent” of the user2. Data centric DTOs3. Domain without verbs4. Behavior lives in the client

Page 26: CQRS Andriy Drozdyuk

Behavioral Interface

1. Bring intention of the user forward

Page 27: CQRS Andriy Drozdyuk
Page 28: CQRS Andriy Drozdyuk

Commands

1. Command = operation name + data required2. Imperative tone3. Only carry necessary information

Page 29: CQRS Andriy Drozdyuk

Operation name + data required

class ReserveSeatCmd(flightId:GUID, seat:Int)

Page 30: CQRS Andriy Drozdyuk

Imperative tone

MakeSaleCommand

vs:

SaleOccured

Page 31: CQRS Andriy Drozdyuk

Only required information

MakeSaleCommand(date:Date, amount:Price)

vs.

class SaleDTO { date: Date amount: Price, cleared: Bool, isDeleted: False, preferred: False}

Page 32: CQRS Andriy Drozdyuk

Good or Bad?

ChangeAddress

Page 33: CQRS Andriy Drozdyuk

Good or Bad?

ChangeAddress

Try “Correct Address”, “Relocate Customer”

Page 34: CQRS Andriy Drozdyuk

Good or Bad?

CreateUser

Page 35: CQRS Andriy Drozdyuk

Good or Bad?

CreateUser

Try “RegisterUser”

Page 36: CQRS Andriy Drozdyuk

Good or Bad?

DeleteCourse

Page 37: CQRS Andriy Drozdyuk

Good or Bad?

DeleteCourse

Try “UnenrollStudent”

Page 38: CQRS Andriy Drozdyuk

Commands

1. Not difficult but unfamiliar2. Seen as a lot of work3. If bottleneck, likely doing it in the wrong place

Page 39: CQRS Andriy Drozdyuk

CQRS

Page 40: CQRS Andriy Drozdyuk

Split model in two

1. One containing Queries2. One containing Commands

Page 41: CQRS Andriy Drozdyuk
Page 42: CQRS Andriy Drozdyuk
Page 43: CQRS Andriy Drozdyuk

Command Query

1. Consistency Consistent Eventual

2. Data Storage 3NF 1NF

3. Scalability Few transactions Many requests

Page 44: CQRS Andriy Drozdyuk

It is not possible to create an optimal solution for searching, reporting, and processing transactions utilizing a single model

-Greg Young

Page 45: CQRS Andriy Drozdyuk

Query Side

Page 46: CQRS Andriy Drozdyuk

Problems with queries in SA

1. Projected from Domain2. DTO should match UI3. Domain Models should match business

Page 47: CQRS Andriy Drozdyuk

Common Smells

1. Repositories with read methods (paging, sorting)2. Getters on Domain Objects3. Prefetching4. Loading multiple aggregates5. Optimizing queries is hard

Page 48: CQRS Andriy Drozdyuk

Common Smells

1. Repositories with read methods (paging, sorting)2. Getters on Domain Objects3. Prefetching4. Loading multiple aggregates5. Optimizing queries is hard

Impedance Mismatch

Page 49: CQRS Andriy Drozdyuk
Page 50: CQRS Andriy Drozdyuk

Benefits

1. Does not suffer from impedance mismatch2. Queries can be optimized, fine-tuned3. Developers only have to understand data model4. Developers don’t need to know ORM5. Domain not affected by query requirements & can be specialized

Page 51: CQRS Andriy Drozdyuk

Command Side

Page 52: CQRS Andriy Drozdyuk

Problems with SA

1. Domain handled both commands and queries2. Caused issues with the Domain

Page 53: CQRS Andriy Drozdyuk

Common Smells

1. Repositories with many read methods (paging, sorting)2. Getters on Domain Objects3. Prefetching4. Loading multiple aggregates

Page 54: CQRS Andriy Drozdyuk
Page 55: CQRS Andriy Drozdyuk

Benefits

1. Domain focused on processing commands2. Domain Objects no longer expose state3. Repositories with few query methods (i.e. getById)4. Aggregate boundaries

Page 56: CQRS Andriy Drozdyuk

Separate Models Costs & Benefits

1. Relatively easy to separate Queries and Commands2. Lowers cost of optimization (querying)3. Domain model - less conceptual overhead4. Worst case: Cost(CQRS) = Cost(SA)

a. Occurs when Query Side uses domain underneath

Page 57: CQRS Andriy Drozdyuk

Can go further...

Page 58: CQRS Andriy Drozdyuk
Page 59: CQRS Andriy Drozdyuk

Look at

1. Domain Events2. Event Sourcing3. Actors

Page 60: CQRS Andriy Drozdyuk

References

1. CQRS Documents by Greg Younghttps://cqrs.wordpress.com/documents/

2. Eric Evans, Domain-Driven Design, 2004.3. Fighting bottlenecks with CQRS

http://verraes.net/2013/12/fighting-bottlenecks-with-cqrs/4. Microsoft CQRS

https://www.microsoftpressstore.com/articles/article.aspx?p=22488095. CQRS Pocket Guide

http://cqrs.wikidot.com/

Page 61: CQRS Andriy Drozdyuk

The End

Page 62: CQRS Andriy Drozdyuk

this slide left intentionally blank

Page 63: CQRS Andriy Drozdyuk

Extra Slides

Page 64: CQRS Andriy Drozdyuk
Page 65: CQRS Andriy Drozdyuk
Page 66: CQRS Andriy Drozdyuk
Page 67: CQRS Andriy Drozdyuk
Page 68: CQRS Andriy Drozdyuk

Data Oriented

Same

Page 69: CQRS Andriy Drozdyuk

Data Oriented

Same

Create Read

Update Delete

Page 70: CQRS Andriy Drozdyuk

Data Oriented

Same

Create Read

Update Delete

Anemic Domain Model(Martin Fowler)

Page 71: CQRS Andriy Drozdyuk

Data Oriented

Page 72: CQRS Andriy Drozdyuk

Prototypical Architecture

Page 73: CQRS Andriy Drozdyuk
Page 74: CQRS Andriy Drozdyuk
Page 75: CQRS Andriy Drozdyuk

CQRS Architecture

Page 76: CQRS Andriy Drozdyuk

DTOsCommands

Events

Page 77: CQRS Andriy Drozdyuk

State &

Invariants

Page 78: CQRS Andriy Drozdyuk

Task Based

UI

Page 79: CQRS Andriy Drozdyuk
Page 80: CQRS Andriy Drozdyuk
Page 81: CQRS Andriy Drozdyuk

DO - DTOs

Page 82: CQRS Andriy Drozdyuk
Page 83: CQRS Andriy Drozdyuk

DO - DTOs

Get, Set

Page 84: CQRS Andriy Drozdyuk

DO - DTOs

Get, Set

Business Logic?

Page 85: CQRS Andriy Drozdyuk

DO - DTOs

Get, Set

Business Logic?Mappers

Page 86: CQRS Andriy Drozdyuk

DO - DTOs

Get, Set

Business Logic?Mappers

Business Logic

Page 87: CQRS Andriy Drozdyuk
Page 88: CQRS Andriy Drozdyuk
Page 89: CQRS Andriy Drozdyuk
Page 90: CQRS Andriy Drozdyuk