45
ES, CQRS & DDD: Lessons Learned (and walls bumped into) Gitte Vermeiren | @GitteTitter

DDD, CQRS & ES lessons learned (Gitte Vermeiren)

  • Upload
    visug

  • View
    498

  • Download
    0

Embed Size (px)

Citation preview

Page 1: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

ES, CQRS & DDD: Lessons Learned (and walls bumped into)

Gitte Vermeiren | @GitteTitter

Page 2: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

One does not simply

Use ES, CQRS & DDD

Page 3: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

UI

Commands

Command Bus

Command

Command Handler

Domain Model

Domain Model

Domain Model

Repository

Event Store

Aggregates

Events

Event Handler

Data

Thin Data Layer

Query DTO

Event BusEvents

Page 4: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Person

Dossier

Payment

TechnicalInvestigation

DocumentGroup

Task

Page 5: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

TaskClosedEvent

TaskPerformedEvent

DocumentRenamedEvent

TaskCreatedEvent

DocumentJudgedEvent

DocumentAddedToDocumentGroupEvent

DocumentMovedEvent

DossierApprovedForPaymentEvent

DocumentPrintedEvent

Page 6: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

https://github.com/MarkNijhof/Fohjin

Page 7: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Problem 1

Page 8: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

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

Page 9: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

UI

Commands

Command Bus

Command

Command Handler

Domain Model

Domain Model

Domain Model

Repository

Event Store

Aggregates

Events

Event Handler

Data

Thin Data Layer

Query DTO

Event BusEvents

Use an autoincrement

column?

Use a ‘DossierNumberGenerator’

Page 10: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

DossierNumberGenerator

_highestNumber = 01. GenerateNext

2. DossierNumberGeneratedEvent

3. onDossierNumberGenerated_highestNumber ++;

Page 11: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

DossierNumberGenerator

_highestNumber = 0

onDossierNumberGenerated_highestNumber ++;

DossierNumberGeneratedEvent

DossierNumberGeneratedEvent

DossierNumberGeneratedEvent

Replay

Repository.GetById<DossierNumberGenerator>(id);

Page 12: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

UI

Commands

Command Bus

Command

Command Handler

Domain Model

Domain Model

Domain Model

Repository

Event Store

Aggregates

Events

Event Handler

Data

Thin Data Layer

Query DTO

Event BusEvents

Use a domain service

Page 13: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Problem 2

Page 14: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 15: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 16: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

DomainEvent

Id

AggregateId

Version

Raised

repo.GetById<Aggregate>(aggregateId);

Get/Store events based on type, not on

eventproviderId?

Page 17: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 18: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Migrate those events

Page 19: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

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 StoreEvent Store

Read the entire event stream Save the entire event stream

Page 20: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

UI

Commands

Command Bus

Command

Command Handler

Domain Model

Domain Model

Domain Model

Repository

Event Store

Aggregates

Events

Event Handler

Data

Thin Data Layer

Query DTO

Event BusEvents

Replay needed

Page 21: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 22: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Event Versioning with an EventUpdater

Page 23: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

AnAggregate

_somePrivateStuff = 0

onSomeEvent:_somePriveStuff = somevalue;

SomeEvent

AnotherEvent

AndAnotherEvent

Replay

Repository.GetById<AnAggregate>(aggregateId);

Page 24: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

SomeEvent

AnotherEvent

AndAnotherEvent

Update

Repository.GetById<AnAggregate>(aggregateId);

SomeUpdatedEvent

AnotherEvent

AndAnotherEvent

AndAnotherEvent

Page 25: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Problem 3

Page 26: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 27: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 28: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

AnAggregateSnapshot

Repository.GetById<AnAggregate>(aggregateId);

_version = 666

SomeEventVersion = 667

AnotherEventVersion = 668

AndAnotherEventVersion = 669

AnAggregate

_somePrivateStuff = 0

onSomeEvent:_somePriveStuff = somevalue;

Replay

Page 29: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 30: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Problem 4

Page 31: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Hard to use in debugging

Hard to do data updates

Hard to query

Page 32: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Problem 5

Page 33: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 34: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

AnAggregate

_somePrivateValue = 0DoSomething

onSomethingHappened_somePrivateValue = something;

DoSomething

SomethingHappenedEvent

Page 35: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

UI

Commands

Command Bus

Command

Command Handler

Domain Model

Domain Model

Domain Model

Repository

Event Store

Aggregates

Events

Event Handler

Data

Thin Data Layer

Query DTO

Event BusEvents

Hard to do data updates

Reuse the same logic

Do it functional

Page 36: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Problem 6

Page 37: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 38: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

And for the good news?

Page 39: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 40: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 41: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 42: DDD, CQRS & ES lessons learned (Gitte Vermeiren)
Page 43: DDD, CQRS & ES lessons learned (Gitte Vermeiren)

Some final thoughts ...

Page 44: DDD, CQRS & ES lessons learned (Gitte Vermeiren)