Eventsourcing workshop 22/3

Mensen aan het programmeren

Eventsourcing workshop 22/3

Ieder kwartaal komen alle collega’s een namiddag samen. Tijdens zo’n samenkomst (code-retreat) bouwen we in teams een algoritme of spel. Dit maal pakken we het anders aan. By popular demand besluiten we een workshop event-sourcing te organiseren.

Als voorbereiding hebben Rob en Robin de content vastgelegd en een startpunt voorzien waarop iedereen kan inpikken.

Tegen één uur stromen alle collega’s binnen. We starten de workshop door naar ieders verwachtingen te peilen. Ivan, de ervaren rot, verwacht een pasklare oplossing. Bruce, de  ‘jonge’ starter, wil geïnspireerd raken. We starten met een beperkte theoretische tekening. Hoe kunnen we met event-sourcing aan de slag gaan? We maken teams van twee en starten.

 

Waarom wel event-sourcing?

De granulaire events die bij event-sourcing gebruikt worden, maken het eenvoudiger om problemen op te sporen.

We kunnen meer informatie uit onze data halen door events op meerdere manieren te interpreteren (projecties).

Waarom niet  event-sourcing?

Event-sourcing vereist een totaal andere kijk op een systeem. Hierdoor is er wel een steile leercurve.

Er is geen één manier om eventsourcing te doen. Het wordt snel een “roll your own” implementatie.

De query’s die je doet op je datastore zijn niet zo voor de hand liggend als SELECT * FROM MijnTabel.

Waarschuwing

Na de workshop was iedereen het er mee eens dat we geen event-sourcing moeten doen om het te doen. De voordelen wegen absoluut niet op tegen de nadelen. We maken samen de bedenking dat je een verdomd goede business reden nodig hebt om event-sourcing te verantwoorden.

Show me the code

Er is niet slechts één manier om event-sourcing te doen. De link naar de code die wij als startpunt gebruiken vind je onderaan.

We identificeren 4 noden:

  • Acties uitvoeren
    src/Involved.Workshop.EventSourcing/Involved.Workshop.EventSourcing.Domain/Table/Car.cs
    Op een wagen kunnen we opties toevoegen en de naam veranderen. Deze business acties leiden tot events die opgeslagen moeten worden.
  • Opslaan van acties (events)
    src/Involved.Workshop.EventSourcing/Involved.Workshop.EventSourcing.Infrastructure/Database/BaseRepository.cs
    Events slaan we in sql op. We hebben hierbij een manier nodig om ze te kunnen mappen op de event klasse. Met die reden slaan we het type mee op. Naast het opslaan moeten we deze ook uit kunnen lezen en voeden aan een aggregate.
  • Opslaan en gebruiken van snapshots (performantie)
    src/Involved.Workshop.EventSourcing/Involved.Workshop.EventSourcing.Host/Database/CarRepository.cs
    Snapshots zijn states van de aggregate op een moment in de tijd. En zijn het resultaat van de events die gemaakt zijn door die aggregate.
  • Gebruiken van projecties (extra business insights)
    src/Involved.Workshop.EventSourcing/Involved.Workshop.EventSourcing.Host/Database/CarRenamedProjectionRepository.cs
    We lezen de events op een andere manier uit om extra informatie over onze data te krijgen. Hierbij zijn we enkel geïnteresseerd in een subset van events. Met deze events bouwen we een andere voorstelling op. In dit geval zien we hoe vaak we een aggregate hernoemen.

De code is absoluut niet productie waardig maar belicht wel alle aspecten om de concepten van eventsourcing onder de knie te krijgen.

 

Na een stevige namiddag programmeren en bijleren sluiten we, naar gewoonte, af met pizza 🍕.

PS de code waarvan we vertrokken zijn kan hier gedownload worden.