300 likes | 633 Vues
Event Sourcing . Cameron Fletcher. Agenda. What is an Event? Events as a Storage Mechanism Versioning Testing with Events Performance and Scalability Demonstration. What is an Event?. An Event.
E N D
Event Sourcing Cameron Fletcher
Agenda • What is an Event? • Events as a Storage Mechanism • Versioning • Testing with Events • Performance and Scalability • Demonstration
An Event An event is something that has happened in the past as a result of a change in state of our domain Glass has been filled Fill glass Event Request to change state Glass is already full! Glass is broken! Exception
Shopping Cart Created Item Added Carts CartId HasCheckedOut Item Added True 1 False Item Added CartItems Name CartId ItemId Checkout Completed Domain Driven Design 1 1 Enterprise Integration Patterns 1 2 Event Centric 1 3
Shopping Cart Created Item Added Item Added Item Added Domain Object Checkout Completed
Shopping Cart Created Item Added Item Added Item Added Item Removed Checkout Completed
7 6 5 snapshot 4 3 2 1
Cart Domain Object Example // request to mutate state publicvoidAdd(Item item) { if (this.itemCount > 5) thrownewCartFullException(this.id); ApplyChange( newItemAdded(this.id, item.Name)); } // mutate state privatevoidApply(ItemAdded @event) { this.itemCount++; }
Domain Object Base protectedvoid ApplyChange(Event @event) { this.ApplyChange(@event, true); } privatevoid ApplyChange(Event@event, bool isNew) { this.AsDynamic().Apply(@event); if (isNew) this.uncommittedChanges.Add(@event); }
Domain Object Reconstitution publicvoidLoadFromHistory(IEnumerable<Event> history) { foreach (var @event in history) this.ApplyChange(@event, false); }
Domain Object Persistence publicIEnumerable<Event> GetUncommittedChanges() { returnthis.uncommittedChanges; } publicvoid MarkChangesAsCommitted() { this.uncommittedChanges.Clear(); }
Overdraw Attempts are Rejected Given An account with a balance of 100 When A debit is requested for 101 Then An InsufficientBalanceException is thrown
Overdraw Attempts are Rejected Given An account is created A deposit was made for 100 When A debit is requested for 101 Then An InsufficientBalanceException is thrown
Overdraw Attempts are Rejected Given A series of events When A command Then Zero or more events, or an exception is thrown
Overdraw Attempts are Rejected Given An account is created A deposit was made for 100 A debit is requested for 101 When A debit is requested for 20 Then An InsufficientBalanceException is thrown
Performance and Scalability Benefits • Append-only model • Partitioning (Sharding) • Persisting Objects • Reconstituting Objects