Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

The Good, The Bad and The Ugly of Event Sourcing

207 views

Published on

In 2009, I first learned about Event Sourcing and Command Query Responsibility Seggregation (CQRS) at a training Greg Young gave in Utrecht, The Netherlands. I remembered to be awed by the scalability and architectural simplicity those styles provided. However, I also remembered the technical complexity that comes with it. In 2012, I was in charge of transitioning a CQRS-based system to Event Sourcing. I knew it would be non-trivial, but boy was I in for a surprise.
So over the last four years I've experienced first-hand how a large group of developers had to deal with the transition. It's a brilliant solution for high-performance or complex business systems, but you need to be aware that this also introduces challenges most people don't tell you about. In this talk, I'd like to share you some of the most powerful benefits of ES, but also show you the flipside of the coin and cover some of the smaller and bigger challenges you'll run into it. Again, I love it and would apply it again without any doubt, but I really want you to understand the trade-offs before you jump on the Event Sourcing train.

Published in: Technology
  • Be the first to comment

The Good, The Bad and The Ugly of Event Sourcing

  1. 1. Dennis Doomen | @ddoomen | Aviva Solutions | The Continuous Improver
  2. 2. Web Application Command Service Query Processor ChangeUser EmailHandler User Unit of Work User Projector DAL Query Handler Read DB Write DB ChangeUserEmailCommand Execute query Get<User>(identity) Invoke method Event Store Load(events) Apply Get changes Dispatcher Events Handle(UserEmailChangedEvent) Submit changes History Query Language / SQL Dennis Doomen | @ddoomen | The Continuous Improver
  3. 3. Domain Event Store Events App RDBMS Events Projection EventsProjection Projection Projector Optimized for specific queries Separate projections database NoSQL Projector Projection-specific storage Projector HTML Raw SQL, Dapper or OR/M Run asynchronously Great for sharding Dennis Doomen | @ddoomen | The Continuous Improver
  4. 4. Events Transaction 6 Transaction 5 Transaction 4 Transaction 3 Transaction 2 Transaction 1 Temporal Projector Read Store Time Projected until this point Immutable, thus auditable and SOX compliance Dennis Doomen | @ddoomen | The Continuous Improver
  5. 5. Domain Event Store Events App Events Projection EventsProjection Projection Projector Application projections RDBMS Reporting Projector Traditional reporting model Asynchronous OLAP Dennis Doomen | @ddoomen | The Continuous Improver
  6. 6. Dennis (v4) Persisted State Changes Dennis (v3) Role Granted PasswordChangedEvent Dennis (v4) Dennis (v3) User Created Role Granted Phone Number Added Password Changed Dennis (v5) Role Revoked Dennis (v6) Role Granted Time Dennis (v7) Password Changed Dennis Doomen | @ddoomen | The Continuous Improver
  7. 7. Changes 1 2 3 6297 6298 6298 Query Data Documents Groups Users Objects Folders User Interface Changes Queries Changes 1 2 3 6299 6300 6301 Query Data Documents Groups Users Objects Folders User Interface ChangesQueries Node Node Replication Process Dennis Doomen | @ddoomen | The Continuous Improver
  8. 8. Events Aggregate Root Entity Entity Value Object Aggregate Root Aggregate Root Aggregate Root Entity Value Object Value Object Dennis Doomen | @ddoomen | The Continuous Improver
  9. 9. Designing your domain based on ownership
  10. 10. Relying on eventual consistent projections
  11. 11. Bad choice in functional keys (e.g. username vs ID)
  12. 12. Running business logic after an domain event is raised
  13. 13. Domain-specific value types in events
  14. 14. Ask questions about consistency Understand the real world
  15. 15. Driven by invariants, not composition Only consistent within aggregate Small aggregates Reference by identity
  16. 16. public class Order { private Status status; public void Cancel() { if (status == Status.InProgress) { Apply(new OrderCanceledEvent()); } } private void When(OrderCanceledEvent e) { status = Status.Canceled; } } In single classes Dennis Doomen | @ddoomen | The Continuous Improver
  17. 17. public partial class Order { private Status status; public void Cancel() { if (status == Status.InProgress) { Apply(new OrderCanceledEvent()); } } } In partial classes public partial class Order { private void When(OrderCanceledEvent e) { status = Status.Canceled; } } Dennis Doomen | @ddoomen | The Continuous Improver
  18. 18. public class Order { private OrderState state; public void Cancel() { if (state.Status == Status.InProgress) { state.Apply(new OrderCanceledEvent()); } } } In separate classes internal class OrderState { public Status Status { get; set; } private void When(OrderCanceledEvent e) { Status = Status.Canceled; } } Dennis Doomen | @ddoomen | The Continuous Improver
  19. 19. Risk Assessment Level Changed Risk Assessment Team Member Removed Risk Assessment Team Member Removed Risk Assessment Level Demoted Versus Dennis Doomen | @ddoomen | The Continuous Improver
  20. 20. Assembly AvSol.Domain.dll Namespace AvSol.Domain.RiskAssessments Type RiskAssessmentLevelChanged Assembly AvSol.ThreadAssessment.dll Namespace: AvSol.ThreadAssessment.Risks.Domain Type RiskAssessmentLevelDowngraded Dennis Doomen | @ddoomen | The Continuous Improver
  21. 21. • Column constraints (e.g. data truncation) • Changes in data invariants (null vs non- null in event versions) • Unexpected projection dependencies • Partial replays.
  22. 22. • Causing duplicate child records • Causing large event streams • Incorrect caching strategy (e.g. on lookups) • Identity case-sensitivity • Incomplete SQL-backed event store reads.
  23. 23. • Side by side rebuilding • Functional archivability and archiving • Projection tracking and ETAs • Prioritization • Partitioning.
  24. 24. • After bugs, schema changes, etc • Manual or automatic (e.g. hashes)
  25. 25. • Liquid Projections – Designed as a library – Promotes fully autonomous projections – Local tracking – ETA calculations • NEventStore • GetEventStore • Apache Kafka?
  26. 26. • The Good, The Bad and the Ugly of Event Sourcing http://www.continuousimprover.com/search/label/event%20sourcing • Effective Aggregate Design (Vaughn Vernon) http://dddcommunity.org/library/vernon_2011/ • Liquid Projections https://github.com/LiquidProjections • Distributed Event Sourcing (Slides) http://www.slideshare.net/dennisdoomen/building-occasionally- connected-applications-using-event-sourcing • Data schema changes in an event sourced system (paper) http://files.movereem.nl/2017saner-eventsourcing.pdf

×