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

You Attended Talk: an introduction to event sourcing

D5a2aef3c745cca287ddef1948157fd3?s=47 carnage
October 03, 2015

You Attended Talk: an introduction to event sourcing

Imagine for a moment you work for a large online retailer specialising in household goods. One morning, the head of marketing comes to you and says "I've had this great idea we're going to send discount vouchers to anyone who's changed their address in the past 3 months; people who've recently moved are more likely to be buying new furniture. Could you retrieve a list of all these customers?" You explain to him your systems only store a customers current address and doesn't record when it was last changed, a new feature is added to the backlog and the head of marketing leaves a little disappointed.

What if you could build a system which was able to answer this kind of question without knowing it up front? A possible solution is to use event sourcing, being able to go back to any previous state of your data is just one advantage of using event sourcing in your application. Event sourcing is a total paradigm shift from the more traditional model of storing an application's current state and can appear to be a very unnatural way to think about and build a system. In this talk I'm going to show you examples of why event sourcing can be a superior model and how to go about building an event sourced system in PHP.

Example code: https://github.com/carnage/broadway-bowling

D5a2aef3c745cca287ddef1948157fd3?s=128

carnage

October 03, 2015
Tweet

Transcript

  1. You Attended Talk: An Introduction To Event Sourcing Christopher Riley

    PHP North West, 2015 1
  2. Introduction

  3. A familiar model 3

  4. Deleting data LineItem table id order id product code quantity

    1 1 PK00001 3 2 1 PK00002 1 3 2 PK00002 1 4 3 PK00007 4 5 4 PK00003 2 6 4 PK00005 6 4
  5. Deleting data LineItem table id order id product code quantity

    1 1 PK00001 3 3 2 PK00002 1 4 3 PK00007 4 5 4 PK00003 2 6 4 PK00005 6 5
  6. Deleting data LineItem table id order id product code quantity

    deleted 1 1 PK00001 3 0 2 1 PK00002 1 0 3 2 PK00002 1 0 4 3 PK00007 4 0 5 4 PK00003 2 0 6 4 PK00005 6 0 6
  7. Deleting data LineItem table id order id product code quantity

    deleted 1 1 PK00001 3 0 2 1 PK00002 1 1 3 2 PK00002 1 0 4 3 PK00007 4 0 5 4 PK00003 2 0 6 4 PK00005 6 0 7
  8. Editing data LineItem table id order id product code quantity

    deleted 1 1 PK00001 3 0 2 1 PK00002 1 1 3 2 PK00002 1 0 4 3 PK00007 4 0 5 4 PK00003 2 0 6 4 PK00005 6 0 8
  9. Editing data LineItem table id order id product code quantity

    deleted 1 1 PK00001 2 0 2 1 PK00002 1 1 3 2 PK00002 1 0 4 3 PK00007 4 0 5 4 PK00003 2 0 6 4 PK00005 6 0 9
  10. Editing data LineItem table id order id product code quantity

    deleted version 1 1 PK00001 3 0 1 2 1 PK00002 1 1 1 3 2 PK00002 1 0 1 4 3 PK00007 4 0 1 5 4 PK00003 2 0 1 6 4 PK00005 6 0 1 10
  11. Editing data LineItem table id order id product code quantity

    deleted version 1 1 PK00001 3 0 1 2 1 PK00002 1 1 1 3 2 PK00002 1 0 1 4 3 PK00007 4 0 1 5 4 PK00003 2 0 1 6 4 PK00005 6 0 1 1 1 PK00001 2 0 2 11
  12. A familiar model (again) 12

  13. Event sourcing

  14. Event sourcing example 14

  15. Advantages

  16. Another Example

  17. Technical advantages • Debugging 17

  18. Technical advantages • Debugging • Scalabilty 18

  19. Technical advantages • Debugging • Scalabilty • Auditing 19

  20. Summary

  21. Retrieving data

  22. Performance Problems?

  23. CQRS

  24. MVC Application 24

  25. CQRS Application 25

  26. Technical advantages • Scalabilty 26

  27. Technical advantages • Scalabilty • Performance 27

  28. Technical advantages • Scalabilty • Performance • Multiple read models

    28
  29. CQRS + Event sourcing Application 29

  30. Code - Stage 1

  31. Bowling Game Entity 31

  32. Game Started Event 32

  33. Bowling Game Entity 33

  34. Command Handler 34

  35. Code - Stage 2

  36. Command Handler 36

  37. Validation of Throw 37

  38. Handling Throw Score Recorded Event 38

  39. Code - Stage 3

  40. Event Sourced Repository 40

  41. Projection 41

  42. Read Model 42

  43. Code - Stage 4

  44. Projection 2 44

  45. Should I use Event sourcing? • Complex to implement 45

  46. Should I use Event sourcing? • Complex to implement •

    Development overhead 46
  47. Should I use Event sourcing? • Complex to implement •

    Development overhead • Less understanding 47
  48. Should I use Event sourcing? • Complex to implement •

    Development overhead • Less understanding • Hard to retofit 48
  49. Conclusions

  50. Further reading • Greg Young • https://github.com/qandidate-labs/broadway • https://github.com/carnage/broadway-bowling 50

  51. Thanks • https://joind.in/talk/view/15440 • @giveupalready • https://github.com/carnage 51