CQRS Andriy Drozdyuk
-
Upload
andriy-drozdyuk -
Category
Technology
-
view
240 -
download
7
Transcript of CQRS Andriy Drozdyuk
![Page 1: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/1.jpg)
this slide left intentionally blank
![Page 2: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/2.jpg)
CommandQueryResponsibilitySegregation
Andriy Drozdyuk
![Page 3: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/3.jpg)
Outline
1. Stereotypical Architecture2. Why SA is used3. Task Based UI4. CQRS5. Query Side6. Command Side
![Page 4: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/4.jpg)
Stereotypical Architecture
![Page 5: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/5.jpg)
![Page 6: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/6.jpg)
![Page 7: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/7.jpg)
Why?
![Page 8: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/8.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/9.jpg)
Tooling
1. Frameworks2. ORM3. Mapping utilities
![Page 10: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/10.jpg)
Why Not?
![Page 11: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/11.jpg)
Downsides
1. Impossible to do Domain Driven Design
![Page 12: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/12.jpg)
Data Oriented
![Page 13: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/13.jpg)
Data Oriented
Same
![Page 14: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/14.jpg)
Data Oriented
Same
Create Read
Update Delete
![Page 15: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/15.jpg)
Data Oriented
Same
Create Read
Update Delete
Anemic Domain Model(Martin Fowler)
![Page 16: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/16.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/17.jpg)
DO DTO
![Page 18: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/18.jpg)
DO DTO
Get, Set
![Page 19: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/19.jpg)
DO DTO
Get, Set
Business Logic?
![Page 20: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/20.jpg)
DO DTO
Get, Set
Business Logic?Mappers
![Page 21: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/21.jpg)
DO DTO
Get, Set
Business Logic
Business Logic?Mappers
![Page 22: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/22.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/23.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/24.jpg)
Task Based UI
![Page 25: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/25.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/26.jpg)
Behavioral Interface
1. Bring intention of the user forward
![Page 27: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/27.jpg)
![Page 28: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/28.jpg)
Commands
1. Command = operation name + data required2. Imperative tone3. Only carry necessary information
![Page 29: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/29.jpg)
Operation name + data required
class ReserveSeatCmd(flightId:GUID, seat:Int)
![Page 30: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/30.jpg)
Imperative tone
MakeSaleCommand
vs:
SaleOccured
![Page 31: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/31.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/32.jpg)
Good or Bad?
ChangeAddress
![Page 33: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/33.jpg)
Good or Bad?
ChangeAddress
Try “Correct Address”, “Relocate Customer”
![Page 34: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/34.jpg)
Good or Bad?
CreateUser
![Page 35: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/35.jpg)
Good or Bad?
CreateUser
Try “RegisterUser”
![Page 36: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/36.jpg)
Good or Bad?
DeleteCourse
![Page 37: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/37.jpg)
Good or Bad?
DeleteCourse
Try “UnenrollStudent”
![Page 38: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/38.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/39.jpg)
CQRS
![Page 40: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/40.jpg)
Split model in two
1. One containing Queries2. One containing Commands
![Page 41: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/41.jpg)
![Page 42: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/42.jpg)
![Page 43: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/43.jpg)
Command Query
1. Consistency Consistent Eventual
2. Data Storage 3NF 1NF
3. Scalability Few transactions Many requests
![Page 44: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/44.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/45.jpg)
Query Side
![Page 46: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/46.jpg)
Problems with queries in SA
1. Projected from Domain2. DTO should match UI3. Domain Models should match business
![Page 47: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/47.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/48.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/49.jpg)
![Page 50: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/50.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/51.jpg)
Command Side
![Page 52: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/52.jpg)
Problems with SA
1. Domain handled both commands and queries2. Caused issues with the Domain
![Page 53: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/53.jpg)
Common Smells
1. Repositories with many read methods (paging, sorting)2. Getters on Domain Objects3. Prefetching4. Loading multiple aggregates
![Page 54: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/54.jpg)
![Page 55: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/55.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/56.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/57.jpg)
Can go further...
![Page 58: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/58.jpg)
![Page 59: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/59.jpg)
Look at
1. Domain Events2. Event Sourcing3. Actors
![Page 60: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/60.jpg)
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](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/61.jpg)
The End
![Page 62: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/62.jpg)
this slide left intentionally blank
![Page 63: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/63.jpg)
Extra Slides
![Page 64: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/64.jpg)
![Page 65: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/65.jpg)
![Page 66: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/66.jpg)
![Page 67: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/67.jpg)
![Page 68: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/68.jpg)
Data Oriented
Same
![Page 69: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/69.jpg)
Data Oriented
Same
Create Read
Update Delete
![Page 70: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/70.jpg)
Data Oriented
Same
Create Read
Update Delete
Anemic Domain Model(Martin Fowler)
![Page 71: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/71.jpg)
Data Oriented
![Page 72: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/72.jpg)
Prototypical Architecture
![Page 73: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/73.jpg)
![Page 74: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/74.jpg)
![Page 75: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/75.jpg)
CQRS Architecture
![Page 76: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/76.jpg)
DTOsCommands
Events
![Page 77: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/77.jpg)
State &
Invariants
![Page 78: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/78.jpg)
Task Based
UI
![Page 79: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/79.jpg)
![Page 80: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/80.jpg)
![Page 81: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/81.jpg)
DO - DTOs
![Page 82: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/82.jpg)
![Page 83: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/83.jpg)
DO - DTOs
Get, Set
![Page 84: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/84.jpg)
DO - DTOs
Get, Set
Business Logic?
![Page 85: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/85.jpg)
DO - DTOs
Get, Set
Business Logic?Mappers
![Page 86: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/86.jpg)
DO - DTOs
Get, Set
Business Logic?Mappers
Business Logic
![Page 87: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/87.jpg)
![Page 88: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/88.jpg)
![Page 89: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/89.jpg)
![Page 90: CQRS Andriy Drozdyuk](https://reader034.fdocuments.net/reader034/viewer/2022042701/55b6e5b9bb61eb92688b4601/html5/thumbnails/90.jpg)