DIY online Coding Dojo: Event Sourcing met EventStore en EventFlow in .NET core
Op 12 februari verwelkomden we 10 mensen op ons kantoor in Amsterdam voor onze eerste dojo van het jaar. Het onderwerp: Event Sourcing. Zelf doen? Dat kan! Met deze Event Sourcing tutorial kun je zelf aan de slag!
Bij Infi zijn we dol op het gebruiken van nieuwe technieken. Voor een klant bij Infi Amsterdam gebruiken we voor de volledige applicatie Event Sourcing. Onze ervaring hiermee is zeer positief en middels deze dojo delen we ons enthousiasme en kennis graag met anderen.
We hebben ons hierbij gericht op mensen die de theorie achter Event Sourcing begrijpen, maar het nog nooit in de praktijk hebben toegepast. Op onze GitHub vind je de volledige opdracht die we in de dojo behandeld hebben, inclusief een uitgebreide instructie. Hopelijk helpt dat je op weg met je eerste Event Sourcing -avontuur! Is het nog een beetje onduidelijk voor je? Lees dan vooral verder.
Wat is Event Sourcing?
Event Sourcing is een techniek waarbij je de huidige staat van je applicatie niet opslaat. In plaats daarvan leg je alle gebeurtenissen (events) vast. Bij elkaar opgeteld vormen ze de huidige staat. Dit levert een aantal toffe voordelen op:
- Je kunt altijd zien hoe je tot een bepaalde staat gekomen bent: je hebt direct een audit trail.
- Dat betekent ook dat je iedere staat in het verleden terug kunt zien
- Doordat je alle data hebt kun je complexe vragen beantwoorden die je tijdens het ontwikkelen nog niet verwacht had te moeten beantwoorden. Bijvoorbeeld, welke hotelgasten checken in het weekend in voor een kamer met uitzicht, bestellen vervolgens een diner via de roomservice, en later op de avond champagne maar raken de minibar niet aan tijdens hun bezoek.
Hoe ziet dit er in de praktijk uit? In dit voorbeeld gaan we uit van een reserveringssysteem voor een hotel. Bij een reservering horen een aantal zaken; de klant, de aankomst- en vertrekdatum en natuurlijk een kamer. De klant doet online een reservering, onze event stream ziet er dan zo uit:
Bij het inchecken wil de klant nog een extra nacht blijven en heeft hij liever een kamer met uitzicht op de zee. De volledige event stream van de reservering ziet er dan als volgt uit:
Zoals je ziet moeten we steeds alle events nalopen om tot de huidige staat van de reservering te komen. Daar staat tegenover dat we ook alle data bewaren en zo automatisch een geschiedenis van de gebeurtenissen hebben. Om de snelheid van alledaagse reads te bevorderen heb je vaak nog een read model naast je event stream. Deze bevat enkel de huidige staat en zit bijvoorbeeld in een SQL database.
Event Sourcing doet recht aan je domein
Misschien heb je wel eens gewerkt met event storming. Een manier waarbij je samen met de domeinexperts op zoek gaat naar de belangrijkste gebeurtenissen in je (toekomstige) applicatie. Events zijn een krachtig instrument om je domein mee te beschrijven, want dat komt heel dicht bij hoe we zaken in het echte leven ook beschrijven. Door ze vervolgens daadwerkelijk op die manier in je applicatie vast te leggen, ga je weer een stap verder in het zo correct mogelijk modelleren van je domein. Het hanteren van een ubiquitous language wordt daar ook eenvoudiger door. De manier waarop je flows in een applicatie met elkaar bespreekt wordt bijna op dezelfde manier beschreven in je code als je gebruik maakt van Event Sourcing. Een paar jaar terug gaven we al een dojo over event storming, zeker het bekijken waard!
Aan de slag!
Nu je de basis weet kun je zelf aan de slag. Je kunt de dojo vinden op onze GitHub. Laat je niet afschrikken door de omvang, we nemen je stap voor stap mee en het wordt gegarandeerd leuk! De dojo is geschreven in .NET Core, dus enige ervaring met C# is wel fijn.
De volgende dingen komen aan bod:
- Introductie van EventStore. De database die we gebruiken om onze events in op te slaan. Er zijn ook andere mogelijkheden, het is zelfs mogelijk in een SQL db.
- Introductie van EventFlow. EventFlow is een framework dat het managen van events wat makkelijker maakt. Zoals elk framework dwingt het je tot een bepaalde manier van werken. Het is echter geen vereiste voor Event Sourcing.
- Basisopdrachten om een gevoel te krijgen hoe je met events werkt in een applicatie. Om het wat minder abstract te maken hebben we een hotelreserveringssysteem voor je klaargezet.
- Bonusopdrachten die wat dieper op de stof ingaan en ook enkele nadelen aan het licht brengen. Wat doe je bijvoorbeeld als de inhoud van een event wijzigt? En hoe ga je om met GDPR/AVG wetgeving in combinatie met events die permanent en niet-verwijderbaar zijn?
Dus ga lekker naar https://github.com/infi-nl/coding-dojo-event-sourcing-with-eventstore-and-eventflow/ en ontdek de wondere wereld van Event Sourcing.
Leesvoer
Mocht je nog wat meer willen lezen over Event Sourcing dan kan ik je deze artikelen aanbevelen:
- Een korte introductie: https://dev.to/barryosull/event-sourcing-what-it-is-and-why-its-awesome
- Voor als je wat meer tijd hebt: https://arkwright.github.io/event-sourcing.html
- Op de website van EventStore vind je ook een aantal intressante artikelen, waaronder deze over de bussiness value van een event log https://eventstore.com/docs/event-sourcing-basics/business-value-of-the-event-log/index.html.
Als je er dan nog niet genoeg van hebt kun je ook eens deze Event Sourcing dojo bekijken die we in 2015 gaven. En houd verder natuurlijk onze meetup pagina in de gaten, we geven regelmatig andere dojo’s over uiteenlopende onderwerpen.