Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Drukwerkdeal.nl Developer Meetup - Event Sourcing After Launch

Drukwerkdeal.nl Developer Meetup - Event Sourcing After Launch

Event sourcing can be a solution for certain problems in your application, but it also comes with its own set of challenges. One of those is the evolution of your event schema. How should you handle changes to events? Michiel et al. found many approaches while doing research (they published earlier results in their paper “The Dark Side of Event Sourcing”) and they gained a lot of experienced from building a full-size ERP application using CQRS and event sourcing. In this talk he will show what kind of approaches they’ve found and what they used to deal with our specific challenges. He will also share early research results from interviews with over 20 different companies using event sourcing. Every request for advice can be answered with ‘it depends’, and this talk will not solve that. But he will tell you what your options are, what he think works, and what many others have done.

Michiel Overeem

March 01, 2018
Tweet

More Decks by Michiel Overeem

Other Decks in Technology

Transcript

  1. Event Sourcing after launch how to evolve your event store

    along with your application Michiel Overeem, AFAS, @michielovereem
  2. Event sourcing 101 accountId balance owner 1234567 0 Michiel Current

    state Event sourcing Event BankAccountCreated (accountId: 1234567, balance: 0, owner: Michiel)
  3. Event sourcing 101 accountId balance owner 1234567 100 Michiel Current

    state Event sourcing Event BankAccountCreated (accountId: 1234567, balance: 0, owner: Michiel) DepositPerformed (accountId : 1234567, amount: 100, balance: 100)
  4. Event sourcing 101 Event BankAccountCreated (accountId: 1234567, balance: 0, owner:

    Michiel) DepositPerformed (accountId : 1234567, amount: 100, balance: 100) WithdrawalPerformed (accountId: 1234567, amount: 50, balance: 50) accountId balance owner 1234567 50 Michiel Current state Event sourcing
  5. Event sourcing 101 Event BankAccountCreated (accountId: 1234567, balance: 0, owner:

    Michiel) DepositPerformed (accountId : 1234567, amount: 100, balance: 100) WithdrawalPerformed (accountId: 1234567, amount: 50, balance: 50) OwnerChanged (accountId: 1234567, newOwner: Marten) accountId balance owner 1234567 50 Marten Current state Event sourcing
  6. Event sourcing 101 Event ShoppingCartCreated (cartid: 1234567, user: Michiel) cartid

    articles user 1234567 0 Michiel Current state Event sourcing
  7. Event sourcing 101 Event ShoppingCartCreated (cartid: 1234567, user: Michiel) ArticleAddedToCart(cartid:

    1234567, article: Lumia 950) cartid articles user 1234567 1 Michiel Current state Event sourcing cartid article 1234567 Lumia 950
  8. Event sourcing 101 cartid articles user 1234567 0 Michiel Current

    state Event sourcing cartid article Event ShoppingCartCreated (cartid: 1234567, user: Michiel) ArticleAddedToCart(cartid: 1234567, article: Lumia 950) ArticleRemovedFromCart(cartid: 1234567, article: Lumia 950)
  9. Event sourcing 101 cartid articles user 1234567 1 Michiel Current

    state Event sourcing cartid article 1234567 iPhone X Event ShoppingCartCreated (cartid: 1234567, user: Michiel) ArticleAddedToCart(cartid: 1234567, article: Lumia 950) ArticleRemovedFromCart(cartid: 1234567, article: Lumia 950) ArticleAddedToCart(cartid: 1234567, article: iPhone X)
  10. Event sourcing 101 cartid articles user 1234567 1 Michiel Current

    state Event sourcing cartid article 1234567 iPhone X Event ShoppingCartCreated (cartid: 1234567, user: Michiel) ArticleAddedToCart(cartid: 1234567, article: Lumia 950) ArticleRemovedFromCart(cartid: 1234567, article: Lumia 950) ArticleAddedToCart(cartid: 1234567, article: iPhone X)
  11. Which streams are in the store? Which event types are

    in which stream? Which attributes does an event have?
  12. Applications that do not evolve in response to changing requirements

    or changing technology become less useful -Lehman, 1974
  13. “You align the events with real world events. You are

    dealing with changes that have a native equivalence. Doing DDD leads to less fragile design.”
  14. “So one of the things you should never ever do

    is change existing events. An event written persisted to datastore is not like a hand wavy thing. It is a fact.”
  15. Variations 1. Create a new store from the old one.

    2. Create a new stream inside of the store, based on old streams. 3. Create new events in an existing stream.
  16. Prevention Techniques Pruning Privacy Read models 24 interviews on event

    sourcing and upgrades Event sourced systems after launch are not scary
  17. So, what is our solution? 1. Copy-transform of the whole

    store 1. 100.000 events in 4.5 minute (around 360 per sec) 2. Rebuild query side 1. All projectors run in parallel 3. We deploy in blue-green
  18. What do we (think we) want? 1. No renames 2.

    Weak schema: handle new attributes with ease 3. Upcasters: solve complex cases without long delays 4. Copy-transform: 1. Remove upcasters 2. Only those streams that need it 5. Only rebuild projections when necessary
  19. Copyright Nasa Goddard Michiel Overeem @michielovereem Event Sourced Systems after

    launch: 1. Prevention 2. Techniques for upgrading 3. Prune your store 4. Think about privacy 5. Rebuild your read models