Top Banner
DDD, CQRS & ES: Lessons Learned (and walls bumped into) @GitteTitter proq.blogspot.com
41

DDD, CQRS, ES lessons learned

Jun 26, 2015

Download

Technology

Qframe

DDD, CQRS and ES: lessons learned (and walls bumped into)
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: DDD, CQRS, ES lessons learned

DDD, CQRS & ES: Lessons Learned

(and walls bumped into)

@GitteTitterproq.blogspot.com

Page 2: DDD, CQRS, ES lessons learned

One does not simply

Use DDD, CQRS & ES

Page 3: DDD, CQRS, ES lessons learned

UI

Commands

Command Bus

Command

Command Handler

Domain Model

Domain Model

Domain Model

Repository

Event Store

Aggregates

Events

Event Bus Event Handler

Data

Thin Data Layer

Query DTO

Events

Page 4: DDD, CQRS, ES lessons learned

https://github.com/MarkNijhof/Fohjin

Page 5: DDD, CQRS, ES lessons learned

Problem 1

Page 6: DDD, CQRS, ES lessons learned

“Every ‘dossier’, ‘scan’, ‘decision’, ... Should have a unique incremental number”

Page 7: DDD, CQRS, ES lessons learned

UI

Commands

Command Bus

Command

Command Handler

Domain Model

Domain Model

Domain Model

Repository

Event Store

Aggregates

Events

Event Bus Event Handler

Data

Thin Data Layer

Query DTO

Events Use an autoincrement

column?

Use a ‘DossierNumberGenerator’

Page 8: DDD, CQRS, ES lessons learned

DossierNumberGenerator

_highestNumber = 01. GenerateNext

2. DossierNumberGeneratedEvent

3. onDossierNumberGenerated_highestNumber ++;

Page 9: DDD, CQRS, ES lessons learned

DossierNumberGenerator

_highestNumber = 0

onDossierNumberGenerated_highestNumber ++;

DossierNumberGeneratedEvent

DossierNumberGeneratedEvent

DossierNumberGeneratedEvent

Replay

Repository.GetById<DossierNumberGenerator>(id);

Page 10: DDD, CQRS, ES lessons learned

Problem 2

Page 11: DDD, CQRS, ES lessons learned
Page 12: DDD, CQRS, ES lessons learned
Page 13: DDD, CQRS, ES lessons learned

DomainEvent

Id

EventProviderId

Version

Raised

repo.GetById<EventProvider>(eventproviderId);

Get events based on type, not on eventproviderId?

Page 14: DDD, CQRS, ES lessons learned

Migrate those events

Page 15: DDD, CQRS, ES lessons learned

WIP

AnotherNewRefactoredAggregate

ANewRefactoredAggregate

anAggregate

SomeEvent

SomeOtherEvent

AndSomeMoreEvent

Migration Process

SomeEvent

SomeOtherEvent

AndSomeMoreEvent

AndAFunkyEvent

https://github.com/vermegi/Eventstream.Migratorhttps://github.com/NEventStore/NEventStore.Migrations

Event Store Event Store

Read the entire event stream Save the entire event stream

Page 16: DDD, CQRS, ES lessons learned

UI

Commands

Command Bus

Command

Command Handler

Domain Model

Domain Model

Domain Model

Repository

Event Store

Aggregates

Events

Event Bus Event Handler

Data

Thin Data Layer

Query DTO

Events

Replay needed!

Page 17: DDD, CQRS, ES lessons learned
Page 18: DDD, CQRS, ES lessons learned

Event Versioning with an EventUpdater

Page 19: DDD, CQRS, ES lessons learned

AnAggregate

_somePrivateStuff = 0

onSomeEvent:_somePriveStuff = somevalue;

SomeEvent

AnotherEvent

AndAnotherEvent

Replay

Repository.GetById<AnAggregate>(aggregateId);

Page 20: DDD, CQRS, ES lessons learned

SomeEvent

AnotherEvent

AndAnotherEvent

Update

Repository.GetById<AnAggregate>(aggregateId);

SomeUpdatedEvent

AnotherEvent

AndAnotherEvent

AndAnotherEvent

Page 21: DDD, CQRS, ES lessons learned

Problem 3

Page 22: DDD, CQRS, ES lessons learned
Page 23: DDD, CQRS, ES lessons learned
Page 24: DDD, CQRS, ES lessons learned

AnAggregateSnapshot

Repository.GetById<AnAggregate>(aggregateId);

_version = 666

SomeEventVersion = 667

AnotherEventVersion = 668

AndAnotherEventVersion = 669

AnAggregate

_somePrivateStuff = 0

onSomeEvent:_somePriveStuff = somevalue;

Replay

Page 25: DDD, CQRS, ES lessons learned

Problem 4

Page 26: DDD, CQRS, ES lessons learned

Hard to use in debugging

Hard to do data updates

Hard to query

Page 27: DDD, CQRS, ES lessons learned

Problem 5

Page 28: DDD, CQRS, ES lessons learned
Page 29: DDD, CQRS, ES lessons learned

AnAggregate

_somePrivateValue = 0DoSomething

onSomethingHappened_somePrivateValue = something;

DoSomething

SomethingHappenedEvent

WIPhttps://github.com/vermegi/ReplayDomain

Page 30: DDD, CQRS, ES lessons learned
Page 31: DDD, CQRS, ES lessons learned

UI

Commands

Command Bus

Command

Command Handler

Domain Model

Domain Model

Domain Model

Repository

Event Store

Aggregates

Events

Event Bus Event Handler

Data

Thin Data Layer

Query DTO

Events

Hard to do data updates

Reuse the same logic

Do it functional

Page 32: DDD, CQRS, ES lessons learned

Problem 6

Page 33: DDD, CQRS, ES lessons learned
Page 34: DDD, CQRS, ES lessons learned

And for the good news?

Page 35: DDD, CQRS, ES lessons learned
Page 36: DDD, CQRS, ES lessons learned
Page 37: DDD, CQRS, ES lessons learned
Page 38: DDD, CQRS, ES lessons learned
Page 39: DDD, CQRS, ES lessons learned

Some final thoughts ...

Page 40: DDD, CQRS, ES lessons learned
Page 41: DDD, CQRS, ES lessons learned

Thank you!