2. Who am I?
Maurice de Beijer
The Problem Solver
Microsoft Integration MVP
Freelance developer
DevelopMentor instructor
Twitter:@mauricedb
Blog: http://msmvps.com/blogs/TheProblemSolver/
Web: http://www.TheProblemSolver.nl
E-mail: maurice.de.beijer@gmail.com
3.
4. Data Storage Maturity Model
3 - Event Sourcing
2 - CQRS
1 - Structured storage
0 – Data Dump
5. Data Storage Maturity Model
3 - Event Sourcing
2 - CQRS
1 - Structured storage
0 – Data Dump
The server is often just a simple gateway with just some validation logic
$resource and noSQL database make CRUD applications really easy
There is nothing wrong with a CRUD application if the problem domain is simple
http://www.flickr.com/photos/juhansonin/5144239690
Command Query Responsibility Segregation
CQRS = Command Query Responsibility Segregation
Use a different model to update information than the model you use to read information
http://www.flickr.com/photos/usnavy/8220344431
Still storing just the current state
Database structure is often normalized and optimized for updating
Most application read far more frequently then update
Commands should be modeled after business actions
A business user can understand command names and have a reasonable expectation of the outcome
http://www.flickr.com/photos/micahdowty/4630801442
We are stil storing only the current state
No trace of how we got there
http://www.flickr.com/photos/danrocha/15602018982
Event sourcing doesn’t depend on CQRS but that structure is often used.
Event Sourcing is a very old idea that has become popular again over recent years.
Events provide insight into how the system came to be in its current state
http://www.flickr.com/photos/dragontomato/5174914835
Domain Event is something that has happened in the past
The result of a Command to change something
Very similar to the audit trail in a database
http://www.flickr.com/photos/lendingmemo/11747440176/
No longer storing the current state but all event leading up to it
The current state is a left fold of all events
The projection parts are not really part of ES but CQRS and usually combined
Events are never erased or updated
An append only model
http://www.flickr.com/photos/horiavarlan/4263326117
Events are projected out to the read model
Observed facts = events
Derived facts = projections
http://www.flickr.com/photos/fotnmc/7172465908
Eventual consistency both good and bad
Better scalability
Harder to program the UI
Block until done
Fake it on the client
Use long polling or push notifications
http://www.flickr.com/photos/epsos/5732013768
Event Sourcing adds complexity
Don’t do it where it doesn’t make sense
It’s perfectly fine to use CRUD for static reference and ES for domain in the same app
http://www.flickr.com/photos/10912969@N03/2046600021/
More info:
Martin Fowler: http://martinfowler.com/eaaDev/EventSourcing.html
Greg Young: http://goodenoughsoftware.net/
Daniel Whittaker: http://danielwhittaker.me/tag/event-sourcing/
João Bragança: https://github.com/thefringeninja/derp.inventory
Damian Hickey: http://dhickey.ie/?tag=/Event-Sourcing
https://www.flickr.com/photos/stevendepolo/4582437563/