$30 off During Our Annual Pro Sale. View Details »

Event sourcing in Laravel (full stack brussels)

Event sourcing in Laravel (full stack brussels)

Freek Van der Herten

April 04, 2019
Tweet

More Decks by Freek Van der Herten

Other Decks in Programming

Transcript

  1. Getting started with
    event sourcing in Laravel

    View Slide

  2. About me
    Freek Van der Herten
    Partner & developer at Spatie
    @freekmurze
    https://murze.be
    https://ohdear.app

    View Slide

  3. Spatie
    Since 2003
    Websites, applications and webshops
    Team
    9 awesome human beings
    Specialisation
    Laravel, front-end development

    View Slide

  4. Open Source 

    Software

    View Slide

  5. We create a lot of it
    ± 200 packages on Packagist
    ± 2,000,000 downloads a month
    ± 30,000,000 total downloads
    All Postcardware!

    View Slide

  6. Highlights
    Popular
    laravel-backup
    laravel-medialibrary
    laravel-permission
    New
    laravel-query-builder
    laravel-blade-x

    View Slide

  7. https://spatie.be/open-source

    View Slide

  8. https://spatie.be/open-source/postcards

    View Slide

  9. Let's talk about
    event sourcing

    View Slide

  10. Talk overview
    Theory
    Laravel Event Projector demo
    Eventsauce demo

    View Slide

  11. Theory

    View Slide

  12. Traditional application
    Write data in database
    An update means overwriting the old data
    The old data cannot be accessed anymore

    View Slide

  13. APPLICATION
    DATABASE
    TABLE
    value X

    View Slide

  14. APPLICATION
    DATABASE
    TABLE
    value X
    value Y

    View Slide

  15. Event Sourced Application
    The application will fire off events
    Events will get written in a dedicated store
    Events are passed to consumers that create projections
    Aggregate, Aggregate Root...

    View Slide

  16. APP EVENTS
    Event
    Event 1

    View Slide

  17. APP EVENTS
    Event
    Event 1
    Event 2

    View Slide

  18. APP EVENTS
    Event
    Event 1
    Event 2
    Event 3

    View Slide

  19. APP
    CONSUMER
    EVENTS
    PROJECTION
    Event
    Event 1
    Event 2
    Event 3

    View Slide

  20. APP
    CONSUMER
    CONSUMER 2
    EVENTS
    PROJECTION
    Event
    Event 1
    Event 2
    Event 3
    ANOTHER PROJECTION

    View Slide

  21. APP
    CONSUMER
    CONSUMER 2
    EVENTS
    PROJECTION
    Event
    Event 1
    Event 2
    Event 3
    ANOTHER PROJECTION

    View Slide

  22. APP
    CONSUMER
    CONSUMER 2
    EVENTS
    PROJECTION
    Event
    Event 1
    Event 2
    Event 3
    Event 4
    ANOTHER PROJECTION

    View Slide

  23. Event Sourced Application
    Auditing requirements
    Extra reports needed
    Recording the unhappy path
    There is some setup required

    View Slide

  24. Laravel 

    Event Projector

    View Slide

  25. Laravel Event Projector
    Package made by Spatie
    It's not full event sourcing, it focuses on projections
    Beautifully integrated into Laravel
    Easy to get started with

    View Slide

  26. https://docs.spatie.be/laravel-event-projector

    View Slide

  27. Demo

    View Slide

  28. Eventsauce

    View Slide

  29. Eventsauce
    Package made by Frank De Jonge
    Focuses on aggregates
    Framework agnostic
    Separate Laravel bindings package available
    Very powerful, adds complexity

    View Slide

  30. https://eventsauce.io/docs/

    View Slide

  31. APP
    Subtract $1000

    View Slide

  32. AGGREGATE ROOT REPOSITORY
    UUID PAYLOAD TIME
    APP
    Subtract $1000

    View Slide

  33. AGGREGATE ROOT REPOSITORY
    UUID PAYLOAD TIME
    APP
    Subtract $1000
    RETRIEVE
    Subtract $1000
    AGGREGATE ROOT
    (empty)

    View Slide

  34. AGGREGATE ROOT REPOSITORY
    ABC-123 Subtract 1000 11:12 AM
    UUID PAYLOAD TIME
    APP
    Subtract $1000
    RETRIEVE
    Subtract $1000
    AGGREGATE ROOT
    ACCOUNTS
    CONSUMER
    -$1000
    (empty)
    PERSIST

    View Slide

  35. AGGREGATE ROOT REPOSITORY
    ABC-123 Subtract 1000 11:12 AM
    UUID PAYLOAD TIME
    APP
    RETRIEVE
    Subtract $750
    AGGREGATE ROOT
    ACCOUNTS
    -$1000
    CONSUMER
    Subtract $750
    Subtract $1000
    PERSIST

    View Slide

  36. AGGREGATE ROOT REPOSITORY
    ABC-123 Subtract 1000 11:12 AM
    ABC-124 Subtract 750 01:17 PM
    UUID PAYLOAD TIME
    APP
    RETRIEVE
    Subtract $750
    AGGREGATE ROOT
    ACCOUNTS
    -$1750
    CONSUMER
    Subtract $750
    Subtract $1000
    PERSIST

    View Slide

  37. AGGREGATE ROOT REPOSITORY
    ABC-123 Subtract 1000 11:12 AM
    ABC-124 Subtract 750 01:17 PM
    UUID PAYLOAD TIME
    APP
    RETRIEVE
    AGGREGATE ROOT
    ACCOUNTS
    -$1750
    CONSUMER
    Subtract $1250
    Subtract $1000
    Subtract $750
    Subtract $1250
    More Money Needed
    PERSIST

    View Slide

  38. AGGREGATE ROOT REPOSITORY
    ABC-123 Subtract 1000 11:12 AM
    ABC-124 Subtract 750 01:17 PM
    ABC-125 Subtract 1250 05:51 PM
    ABC-126 More Money Needed 05:51 PM
    UUID PAYLOAD TIME
    ACCOUNTS
    APP
    CONSUMER
    CONSUMER 2
    PROPOSED LOANS
    Subtract $1250
    -$3000
    RETRIEVE
    PERSIST
    Subtract $1000
    Subtract $750
    Subtract $1250
    More Money Needed
    AGGREGATE ROOT

    View Slide

  39. Demo

    View Slide

  40. In closing

    View Slide

  41. Summary
    Laravel Event Projector
    Easy to use package to get started with projections
    Hooks into Laravel's native events
    Replay capabilities
    No aggregates

    View Slide

  42. Summary
    EventSauce
    Framework agnostic
    Support for aggregates, process modelling
    No replay capabilities out of the box
    https://github.com/spatie/laravel-eventsauce

    View Slide

  43. Writes are harder, reads are easier

    View Slide

  44. Event sourcing makes the easy things harder…
    …and the harder things easier
    — Frank De Jonge

    View Slide

  45. Larabank
    https://github.com/spatie/larabank-traditional
    https://github.com/spatie/larabank-event-projector
    https://github.com/spatie/larabank-eventsauce

    View Slide

  46. Resources
    https://kickstarter.engineering/event-sourcing-made-simple-4a2625113224
    https://github.com/spatie/laravel-event-projector
    https://github.com/eventsaucephp/eventsauce
    https://github.com/prooph

    View Slide

  47. Thank you!
    https://speakerdeck.com/freekmurze/event-sourcing-full-stack-brussels
    https://spatie.be/open-source
    https://murze.be
    https://ohdear.app

    View Slide