Introduction to Event Sourcing and CQRS (IASA-IL)

61
Introduction to Event Sourcing … and CQRS

Transcript of Introduction to Event Sourcing and CQRS (IASA-IL)

Page 1: Introduction to Event Sourcing and CQRS (IASA-IL)

Introduction to Event Sourcing

… and CQRS

Page 2: Introduction to Event Sourcing and CQRS (IASA-IL)

Vladik KhononovChief Architect at Internovus

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

vladikk vladikkhttp://vladikk.com

Page 3: Introduction to Event Sourcing and CQRS (IASA-IL)

Information Systems

Page 4: Introduction to Event Sourcing and CQRS (IASA-IL)

HTML5AngularJSWPFIOSFlashExtJSAndroidSilverlightResponsive webdesignSPACSS3UserInterface

Page 5: Introduction to Event Sourcing and CQRS (IASA-IL)

UserInterface MySQLMongoDBDynamoDBNeo4jRavenDBPostgreSQLHBaseCassandraSql ServerMariaDBRedisCouchDBData

Access

Page 6: Introduction to Event Sourcing and CQRS (IASA-IL)

UserInterface

Data Access“Verbs & Nouns”Domain Driven

DesignBusiness

Logic

Page 7: Introduction to Event Sourcing and CQRS (IASA-IL)

Domain Driven Design?

Page 8: Introduction to Event Sourcing and CQRS (IASA-IL)
Page 9: Introduction to Event Sourcing and CQRS (IASA-IL)

UserInterface

Business Logic

Data Access

Page 10: Introduction to Event Sourcing and CQRS (IASA-IL)

– www.dictionary.com

Model: A simplified representation of a system or phenomenon.

– www.wikipedia.org

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

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

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

.מהותית

Page 11: Introduction to Event Sourcing and CQRS (IASA-IL)

UserInterface

Business Logic

Data Access

Page 12: Introduction to Event Sourcing and CQRS (IASA-IL)

Domain Model

Page 13: Introduction to Event Sourcing and CQRS (IASA-IL)

Good Domain Model• Not too much

• Not too less

• Sweet spot

• The information we need

• The information we will need

Page 14: Introduction to Event Sourcing and CQRS (IASA-IL)

Why domain models fail

• We absolutely suck at predicting the future

• No single model can suit all the use cases

• Model transformations are painful

Page 15: Introduction to Event Sourcing and CQRS (IASA-IL)

Case Study: Customers

Management

Page 16: Introduction to Event Sourcing and CQRS (IASA-IL)

• 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 17: Introduction to Event Sourcing and CQRS (IASA-IL)

• 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 18: Introduction to Event Sourcing and CQRS (IASA-IL)

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 19: Introduction to Event Sourcing and CQRS (IASA-IL)

• 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 20: Introduction to Event Sourcing and CQRS (IASA-IL)

• 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 21: Introduction to Event Sourcing and CQRS (IASA-IL)

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

Page 22: Introduction to Event Sourcing and CQRS (IASA-IL)

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 23: Introduction to Event Sourcing and CQRS (IASA-IL)

Id Name Email Phone number Status Scheduled Call

10 John [email protected] 04-2342343 New

Page 24: Introduction to Event Sourcing and CQRS (IASA-IL)

Id Name Email Phone number Status Scheduled Call

10 John [email protected] 04-2342343 CallLater

27/10/2014

Page 25: Introduction to Event Sourcing and CQRS (IASA-IL)

Id Name Email Phone number Status Scheduled Call

10 John [email protected] 08-9876653 CallLater

27/10/2014

Page 26: Introduction to Event Sourcing and CQRS (IASA-IL)

Id Name Email Phone number Status Scheduled

Call

10 John [email protected] 08-9876653 Converted

Page 27: Introduction to Event Sourcing and CQRS (IASA-IL)

Id Name Email Phone number Status Scheduled

Call

10 John [email protected] 08-9876653 Converted

Page 28: Introduction to Event Sourcing and CQRS (IASA-IL)

Event SourcingCapture all changes to an

application state as a sequence of events

~ Martin Fowler

Page 29: Introduction to Event Sourcing and CQRS (IASA-IL)
Page 30: Introduction to Event Sourcing and CQRS (IASA-IL)

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 31: Introduction to Event Sourcing and CQRS (IASA-IL)

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 32: Introduction to Event Sourcing and CQRS (IASA-IL)

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 33: Introduction to Event Sourcing and CQRS (IASA-IL)

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 34: Introduction to Event Sourcing and CQRS (IASA-IL)

Id Name Email Phone number Status Scheduled

Call

10 John [email protected] 08-9876653 Converted

Page 35: Introduction to Event Sourcing and CQRS (IASA-IL)

1. new StatusChanged(Status.CallLater)

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

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

4. new StatusChanged(Status.Converted)

Page 36: Introduction to Event Sourcing and CQRS (IASA-IL)

Event StorageEntity Id + New events

Entity IdEvent1,Event2,Event3,

….

Page 37: Introduction to Event Sourcing and CQRS (IASA-IL)

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 38: Introduction to Event Sourcing and CQRS (IASA-IL)

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 39: Introduction to Event Sourcing and CQRS (IASA-IL)

class Customer {int Id;string Name;string Email;string

PhoneNumber;Status Status;DateTime?

ScheduledCall;List<IEvent> Events;

}

Page 40: Introduction to Event Sourcing and CQRS (IASA-IL)

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

}

Page 41: Introduction to Event Sourcing and CQRS (IASA-IL)

class CustomerAnalysisModel {int Id;string

Name;string

Email;string

PhoneNumber;List<StatusChange>

StatusChanges;DateTime?

ScheduledCall;}

Page 42: Introduction to Event Sourcing and CQRS (IASA-IL)

Good Domain Model• Not too much

• Not too less

• Sweet spot

• The information we need

• The information we might need

Page 43: Introduction to Event Sourcing and CQRS (IASA-IL)

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 44: Introduction to Event Sourcing and CQRS (IASA-IL)
Page 45: Introduction to Event Sourcing and CQRS (IASA-IL)

Event StorageEntity Id + New events

Entity IdEvent1,Event2,Event3,

….

Page 46: Introduction to Event Sourcing and CQRS (IASA-IL)

CQRSCommand Query Responsibility

Segregation

Page 47: Introduction to Event Sourcing and CQRS (IASA-IL)

Laye

red

Arch

itect

ure

Page 48: Introduction to Event Sourcing and CQRS (IASA-IL)

Step

1

Page 49: Introduction to Event Sourcing and CQRS (IASA-IL)

Step

2

Page 50: Introduction to Event Sourcing and CQRS (IASA-IL)

Step

3

Page 51: Introduction to Event Sourcing and CQRS (IASA-IL)

CQRS

Page 52: Introduction to Event Sourcing and CQRS (IASA-IL)

• 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 53: Introduction to Event Sourcing and CQRS (IASA-IL)

Bounded Contexts

Page 54: Introduction to Event Sourcing and CQRS (IASA-IL)

Domain Types

• Core Domain

• Subdomain

• Generic Subdomain

Page 55: Introduction to Event Sourcing and CQRS (IASA-IL)

Plexop

Page 56: Introduction to Event Sourcing and CQRS (IASA-IL)

Campaign Management

(Core Domain)Creative Catalog

(Subdomain)

User Management(Generic Subdomain)

Billing(Generic Subdomain)

Page 57: Introduction to Event Sourcing and CQRS (IASA-IL)

Before you try this at home

• Read “Implementing Domain Driven Design” by Vaughn Vernon

• Read “Domain Driven Design” by Eric Evans

• Follow Greg Young, Udi Dahan, DDD community

• Read DDD/CQRS on Google Groups

• Join http://meetup.com/DDD-IL :)

Page 58: Introduction to Event Sourcing and CQRS (IASA-IL)

Questions?

Page 59: Introduction to Event Sourcing and CQRS (IASA-IL)

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

http://twitter.com/vladikk

http://vladikk.com

Page 60: Introduction to Event Sourcing and CQRS (IASA-IL)
Page 61: Introduction to Event Sourcing and CQRS (IASA-IL)