introduction to event sourcing and cqrs

52
Introduction to Event Sourcing … and CQRS

Upload: vladik-khononov

Post on 05-Jul-2015

389 views

Category:

Technology


4 download

DESCRIPTION

Event sourcing is a pattern for modelling your application’s business logic. It states that all changes to application state should be defined and stored as a sequence of events. The idea of recording events for information storage is nothing new. It has been used for decades in finance, healthcare, and other fields. A few years ago it was rediscovered in software design and its advantages are many: - Suitable for building scalable, highly concurrent, distributed systems. - The stored events give you the true history of a system. This audit is required by law in some industries. - The system’s state can be reversed to any point in the past for retroactive debugging and data analysis. - Gives freedom to refactor your business logic, thus allows much better response to new requirements. - The required infrastructure is simple - no monstrous databases are involved. The focus of my talk will be the Event Sourcing pattern, but I’ll also briefly describe CQRS - an architecture that goes hand in hand with Event Sourcing.

TRANSCRIPT

Page 1: Introduction to Event Sourcing and CQRS

Introduction to Event Sourcing … and CQRS

Page 2: Introduction to Event Sourcing and CQRS

Vladik KhononovSolutions Architect at Plexop

http://il.linkedin.com/in/vladikkhononov/

vladikk vladikkhttp://vladikk.com

Page 3: Introduction to Event Sourcing and CQRS

Introduction to Event Sourcing… and CQRS

Page 4: Introduction to Event Sourcing and CQRS

Domain Driven Design?

Page 5: Introduction to Event Sourcing and CQRS
Page 6: Introduction to Event Sourcing and CQRS

IntroductionHow we are used to do things

Page 7: Introduction to Event Sourcing and CQRS

PresentationDALBusiness Logic

Domain Model

Page 8: Introduction to Event Sourcing and CQRS

– www.dictionary.com

Model: A simplified representation of a system or phenomenon.

– www.wikipedia.org

מודל: ייצוג תאורטי של מערכת מורכבת, שמטרתו לחקות את המערכת בהיבטים מהותיים. המודל

אינו מתאר כל תופעה במערכת, אלא מתייחס להיבטים מוגדרים ומצומצמים שלה. המודל

מבוסס על קירוב של המציאות בדרך של הפשטה, איחוד ישויות והתעלמות מגורמים שהשפעתם

אינה מהותית.

Page 9: Introduction to Event Sourcing and CQRS

User Interface StorageDomain

Model

Page 10: Introduction to Event Sourcing and CQRS

Domain Model

Page 11: Introduction to Event Sourcing and CQRS

Good Domain Model• Not too much

• Not too less

• Sweet spot

• The information we need

• The information we might need

Page 12: Introduction to Event Sourcing and CQRS

Why domain models fail

• We absolutely suck at predicting the future

• No single model can suit all the use cases (e.g.: transactional processing, business intelligence, search)

• Model transformations are painful

Page 13: Introduction to Event Sourcing and CQRS

Case Study: Customers Management

Page 14: Introduction to Event Sourcing and CQRS

• A customer has customer id number and a name • A customer has contact information: email, phone

number • A customer can be in on of the following states:

New, CallLater, Converted, NotInterested • A seller has seller id number, name and password • The selling home page contains a list of the

customers in the following statuses: • New • CallLater (when scheduled call date is met)

Page 15: Introduction to Event Sourcing and CQRS

• Seller chooses a customer to call from the home page

• Seller can change the customer’s status to “Converted”, “Not Interested”

• Seller can schedule a future call by setting the future call date. The Customer’s status will change to “CallLater”

• Seller can change name, email, and phone number

Page 16: Introduction to Event Sourcing and CQRS

enum Status { New, CallLater, Converted, NotInterested }

class Customer { int Id; string Name; Status Status; DateTime? ScheduledCall; string Email; string PhoneNumber;}

CREATE TABLE Customers ( ID INTEGER, Name CHAR(40), Email CHAR(40), PhoneNumber CHAR(40), Status INTEGER, ScheduledCall DATETIME, PRIMARY KEY (ID))

class Seller { int Id; string Name; string Password;}

CREATE TABLE Sellers ( ID INTEGER, Name CHAR(40), Password CHAR(40) PRIMARY KEY (ID))

Page 17: Introduction to Event Sourcing and CQRS

• Seller can find customers by name, email, and/or phone number in the search page

• The customers should be found by the current and the past values

Page 18: Introduction to Event Sourcing and CQRS

• If no new customers are available on the home page, it should display customers in the NotInterested status, if it was set more than a 30 days ago

Page 19: Introduction to Event Sourcing and CQRS

• Analysts should be able to review status changes history for each customer - change date and the new status

Page 20: Introduction to Event Sourcing and CQRS

class Seller { int Id; string Name; string Password;}

CREATE TABLE Sellers ( ID INTEGER, Name CHAR(40), Password CHAR(40) PRIMARY KEY (ID))

enum Status { New, CallLater, Converted, NotInterested }

class Customer { int Id; string Name; Status Status; DateTime? ScheduledCall; string Email; string PhoneNumber;}

CREATE TABLE Customers ( ID INTEGER, Name CHAR(40), Email CHAR(40), PhoneNumber CHAR(40), Status INTEGER, ScheduledCall DATETIME, PRIMARY KEY (ID))

Page 21: Introduction to Event Sourcing and CQRS

Id Name Email Phone number Status Scheduled Call

10 John [email protected] 04-2342343 New

Page 22: Introduction to Event Sourcing and CQRS

Id Name Email Phone number Status Scheduled Call

10 John [email protected] 04-2342343 CallLater 27/10/2014

Page 23: Introduction to Event Sourcing and CQRS

Id Name Email Phone number Status Scheduled Call

10 John [email protected] 08-9876653 CallLater 27/10/2014

Page 24: Introduction to Event Sourcing and CQRS

Id Name Email Phone number Status Scheduled Call

10 John [email protected] 08-9876653 Converted

Page 25: Introduction to Event Sourcing and CQRS

Id Name Email Phone number Status Scheduled Call

10 John [email protected] 08-9876653 Converted

Page 26: Introduction to Event Sourcing and CQRS

Event SourcingCapture all changes to an application

state as a sequence of events ~ Martin Fowler

Page 27: Introduction to Event Sourcing and CQRS
Page 28: Introduction to Event Sourcing and CQRS

class StatusChanged : IEvent { Status NewStatus; DateTime CreatedOn; int CreatedBy; }

class FutureCallScheduled : IEvent { DateTime ScheduledCallTime; DateTime CreatedOn; int CreatedBy; }

class ContactDetailsWereUpdated : IEvent { string NewName; string NewEmail; string NewPhone; DateTime CreatedOn; int CreatedBy; }

Page 29: Introduction to Event Sourcing and CQRS

class Customer { int Id; string Name; string Email; string PhoneNumber; Status Status; DateTime? ScheduledCall;

List<IEvent> Events; …

void Apply(StatusChanged e) { Status = e.NewStatus;Events.Add(e);

} …. ….}

Page 30: Introduction to Event Sourcing and CQRS

class Customer { int Id; string Name; string Email; string PhoneNumber; Status Status; DateTime? ScheduledCall;

List<IEvent> Events; … …

void Apply(FutureCallScheduled e) { ScheduledCall = e.ScheduledCallTime;Events.Add(e);

} …}

Page 31: Introduction to Event Sourcing and CQRS

class Customer { int Id; string Name; string Email; string PhoneNumber; Status Status; DateTime? ScheduledCall;

List<IEvent> Events; … … …

void Apply(ContactDetailsWereUpdated e) { Name = e.NewName;Email = e.NewEmail;PhoneNumber = e.NewPhoneNumber;Events.Add(e);

} }

Page 32: Introduction to Event Sourcing and CQRS

Id Name Email Phone number Status Scheduled Call

10 John [email protected] 08-9876653 Converted

Page 33: Introduction to Event Sourcing and CQRS

1. new StatusChanged(Status.CallLater)

2. new FutureCallScheduled(’27/10/2014’)

3. new ContactDetailsWereUpdated( NewPhoneNumber=’08-9876653’)

4. new StatusChanged(Status.Converted)

Page 34: Introduction to Event Sourcing and CQRS

Event Storage

Entity Id + New events

Entity IdEvent1,Event2,Event3,

….

Page 35: Introduction to Event Sourcing and CQRS

class CustomerSearchModel { int Id; List<string> Names; List<string> Emails; List<string> PhoneNumbers; Status Status; DateTime? ScheduledCall; … … …

void Apply(ContactDetailsWereUpdated e) { Names.Add(e.NewName);Emails.Add(e.NewEmail);PhoneNumbers.Add(e.NewPhoneNumber);

} }

Page 36: Introduction to Event Sourcing and CQRS

class CustomerAnalysisModel { int Id; string Name; string Email; string PhoneNumber;

List<StatusChange> StatusChanges; DateTime? ScheduledCall; …

void Apply(StatusChanged e) { StatusChanges.Add(

new StatusChange(e.CreatedOn, e.NewStatus));

} …. ….}

Page 37: Introduction to Event Sourcing and CQRS

class Customer { int Id; string Name; string Email; string PhoneNumber; Status Status; DateTime? ScheduledCall; List<IEvent> Events;}

Page 38: Introduction to Event Sourcing and CQRS

class CustomerSearchModel { int Id; List<string> Names;

List<string> Emails;List<string> PhoneNumbers;

Status Status; DateTime? ScheduledCall;}

Page 39: Introduction to Event Sourcing and CQRS

class CustomerAnalysisModel { int Id; string Name; string Email; string PhoneNumber;

List<StatusChange> StatusChanges; DateTime? ScheduledCall; }

Page 40: Introduction to Event Sourcing and CQRS

Good Domain Model✓ Not too much

✓ Not too less

✓ Sweet spot

✓ The information we need

✓ The information we might need

Page 41: Introduction to Event Sourcing and CQRS

Why domain models fail

✓ We absolutely suck at predicting the future

✓ No single model can suit all the use cases (e.g.: transactional processing, business intelligence, search)

✓ Model transformations are painful

Page 42: Introduction to Event Sourcing and CQRS

Event Storage

Entity Id + New events

Entity IdEvent1,Event2,Event3,

….

Page 43: Introduction to Event Sourcing and CQRS

CQRSCommand Query Responsibility Segregation

Page 44: Introduction to Event Sourcing and CQRS

Laye

red

Arch

itect

ure

Page 45: Introduction to Event Sourcing and CQRS

Step

1

Page 46: Introduction to Event Sourcing and CQRS

Step

2

Page 47: Introduction to Event Sourcing and CQRS

Step

3

Page 48: Introduction to Event Sourcing and CQRS

CQ

RS

Page 49: Introduction to Event Sourcing and CQRS

• Event based models

• Effective modeling

• No future predicting required

• Time machine

• Retroactive debugging

• Infrastructural freedom

• Infinite scalability

• Easy to scale writes

• Easy to scale reads

Conclusions

Page 50: Introduction to Event Sourcing and CQRS

Before you try this at home

• Read “Implementing Domain Driven Design” by Vaughn Vernon

• Read “Domain Driven Design” by Eric Evans

• Follow Greg Young

• Read DDD/CQRS on Google Groups

Page 51: Introduction to Event Sourcing and CQRS

Questions?

Page 52: Introduction to Event Sourcing and CQRS

http://il.linkedin.com/in/vladikkhononov

http://twitter.com/vladikk

http://facebook.com/vladikk

http://vladikk.com