Home Blog Hoe event sourcing Omoik betrouwbaar, controleerbaar en inzichtelijk maakt

Hoe event sourcing Omoik betrouwbaar, controleerbaar en inzichtelijk maakt

Event sourcing graphic

Bij het bouwen van Omoik, het privacyvriendelijke enquêteplatform, kwam ik voor een bekende uitdaging te staan: hoe garandeer je betrouwbaarheid, flexibiliteit en compliance voor klanten, zonder het jezelf of je gebruikers moeilijk te maken? Mijn antwoord: event sourcing.

Event sourcing is niet zomaar een technisch patroon; het is een zakelijke enabler. Het maakt software eenvoudiger te onderhouden, makkelijker uit te breiden, en veel nuttiger voor klanten die gedetailleerde analyses, dashboards en controleerbare gegevens nodig hebben. Laten we eens kijken wat dat in de praktijk betekent.

Wat is Event Sourcing?

Ik schreef onlangs een uitgebreidere uitleg over event sourcing, dus als je nog niet helemaal bekend bent met het concept, neem daar gerust een kijkje. Hier is een korte samenvatting:

In plaats van alleen de huidige staat van je data op te slaan (zoals "enquête X heeft 42 reacties"), legt event sourcing elke wijziging vast als een event:

  • SurveyCreated
  • QuestionAdded
  • SubmissionCompleted
  • SubmissionClosed

Deze events worden achtereenvolgens opgeslagen in een event store (ik gebruik kurrent voor Omoik). De huidige staat van een enquête, of een ander onderdeel van het systeem, wordt vervolgens opgebouwd door deze events af te spelen.

Waarom zou je deze “complexiteit” willen?

Voor ontwikkelaars: Elke stuk code hoeft alleen één klein, goed gedefinieerd event af te handelen. Geen verstrengelde businesslogica meer die alle mogelijke staten moet overzien. De enige vraag die je moet beantwoorden is: “Kan ik dit event opslaan?”

Voor bedrijven: Je krijgt een volledige audit trail, de mogelijkheid om trends in de tijd te analyseren, en dashboards die antwoord geven op vragen als “wat gebeurde wanneer, en waarom?” – zelfs als je die vragen pas jaren later stelt.

Technische voordelen: eenvoudigere code en minder context

Event sourcing breekt complexe processen op in kleine behapbare events. Elke event handler hoeft zich maar op één ding tegelijk te richten. Dit maakt code makkelijker om te schrijven, testen en debuggen.

Een voorbeeld in Go van het afhandelen van een enquête-inzending:

type SubmissionAggregate struct {
    Events     []cqrs.Event
    IsStarted  bool
}

func (a *SubmissionAggregate) HandleCommand(ctx context.Context, command cqrs.Command) error {
    switch typedCommand := command.(type) {
    case *StartSurveySubmissionCommand:

        if a.Attributes.IsStarted {
            return nil
        }

        if err := a.ApplyEvent(ctx, &events.SurveyStartedEvent{
            SurveyID:  typedCommand.SurveyID,
            SessionID: typedCommand.SessionID,
            UserAgent: typedCommand.UserAgent,
            Language:  typedCommand.Language,
            Platform:  typedCommand.Platform,
            Url:       typedCommand.Url,
            StartedAt: typedCommand.StartedAt,
        }); err != nil {
            return err
        }
    }
    return nil
}

func (a *SubmissionAggregate) ApplyEvent(ctx context.Context, event cqrs.Event) error {
    a.Events = append(a.Events, event)

    switch typedEvent := event.(type) {
    case *events.SurveyStartedEvent:
        a.IsStarted = true
    }
    return nil
}

Je hebt een aggregate. Die beslist alleen of een event toegepast moet worden op basis van de ontvangen command. Niet meer, niet minder. Elk stukje code is klein, gericht en makkelijk te testen.

Een alternatieve, meer leesbare stijl:

func (a *SubmissionAggregate) StartSubmission(ctx context.Context, cmd events.SurveyStartedEvent) error {

    if a.Attributes.IsStarted {
        return nil
    }

    return a.ApplyEvent(ctx, &events.SurveyStartedEvent{
        SurveyID:  cmd.SurveyID,
        SessionID: cmd.SessionID,
        UserAgent: cmd.UserAgent,
        Language:  cmd.Language,
        Platform:  cmd.Platform,
        Url:       cmd.Url,
        StartedAt: cmd.StartedAt,
    })
}

De implementatie is niet belangrijk – de events zijn dat wel. Wat je ook kiest als opslagmethode, de events (de feiten) zijn de waarheid.

Zakelijke voordelen: Analyses, dashboards en compliance

Techniek is belangrijk, maar als de business geen voordeel ziet, komt event sourcing er niet. Gelukkig zijn er (zeer overtuigende) redenen waarom bedrijven hier ook blij van worden.

Analyses, zelfs over het verleden

Omdat elk event wordt opgeslagen, kun je nieuwe rapporten of dashboards bouwen wanneer je maar wilt, zelfs voor data van jaren geleden. Wil je weten hoe de respons veranderde na het toevoegen van een specifieke vraag? Voeg een projector toe, voer alle relevante events in, en je hebt direct een rapport.

Bij traditionele (CRUD) applicaties is dit onmogelijk – oude data is overschreven en niet terug te halen. Je kunt ook geen historische data simuleren als je ineens een nieuw idee hebt.

Events zijn feiten. Wat je ermee doet is aan jou.

Moeiteloze dashboards

Dashboards geven bruikbare inzichten, en met event sourcing zijn ze makkelijk te bouwen en up-to-date te houden. Je hoeft geen complexe queries te draaien of te hopen dat oude data nog accuraat is.

Bij traditionele applicaties moet je:

  • Gecompliceerde databasequeries schrijven
  • Hopen dat oude data niet is gewijzigd
  • Hopen dat velden in de database niet zijn overschreven

Bij event sourcing is het simpeler:

type SurveyStatistics struct {
    NumberOfViews       uint64
    NumberOfSubmissions uint64
}

func (a *SurveyStatistics) ApplyEvent(ctx context.Context, event cqrs.Event) error {
    switch _ := event.(type) {
    case *events.SurveyStartedEvent:
        a.NumberOfViews++
    case *events.CompletedEvent:
        a.NumberOfSubmissions++
    }
    return nil
}

Na het verwerken van alle events heb je een in-memory model met het aantal views en inzendingen. Zelfs als je geen programmeur bent, is deze code goed te begrijpen.

Audit trails voor compliance, veiligheid en vertrouwen

Elke actie is vastgelegd, voorzien van tijdstempel en gebruiker. Dit is essentieel voor klanten die moeten voldoen aan wet- en regelgeving, of transparantie richting hun eigen gebruikers willen tonen.

Voorbeelden van vragen die je hiermee beantwoordt:

  • "Wie heeft deze vraag gewijzigd, en wanneer?"
  • "Zijn er reacties verwijderd?"
  • "Wat gebeurde er precies tijdens dat incident vorige maand?"

De events liegen niet – en kunnen niet gewijzigd worden.

Realistische toepassing: Omoik

Een praktijkvoorbeeld: bij Omoik vragen klanten vaak om nieuwe manieren om data te analyseren of rapporten te genereren op basis van reacties. Bugs komen ook voor, en kunnen statistieken beïnvloeden. Event sourcing helpt hier enorm.

Nieuwe features? Voeg gewoon nieuwe event types toe zonder risico op dataverlies of ingewikkelde migraties. Ook bij grotere migraties hoef je geen spanning te hebben – je past gewoon een projector aan, voedt hem met bestaande events, en voilà.

En bij bugs die data beïnvloeden? Dan speel je gewoon het event-log opnieuw af en je statistieken zijn hersteld.

Een ander voorbeeld: aangepaste rapporten. Klanten vragen regelmatig rapporten over periodes waarvoor eerst geen rapporten nodig waren. Omdat elk event bewaard blijft, kan ik alsnog die inzichten geven. Zelfs specifieke vragen als: Hoeveel bezoekers beantwoordden vraag 1, maar niet vraag 2, vóórdat we vraag 2 wijzigden van "Hoe heb je over ons gehoord?" naar "Hoe heb je onze website gevonden?" – zijn eenvoudig te beantwoorden.

Dankzij event sourcing kan Omoik snel nieuwe mogelijkheden bieden, zakelijke vragen beantwoorden en betrouwbare data tonen – zonder de stabiliteit van het platform in gevaar te brengen.

Moet jij event sourcing gebruiken?

Ja, het is initieel complexer dan een CRUD-app, maar de winst in betrouwbaarheid, flexibiliteit en inzichten is enorm.

Voor ontwikkelaars: eenvoudiger te bouwen en onderhouden. Bugs zijn makkelijker op te sporen en nieuwe features minder risicovol.

Voor bedrijven: transparantie, compliance en de mogelijkheid om terug te kijken op alles wat ooit gebeurd is.

Conclusie: Bouwen voor de toekomst

Event sourcing is een game changer geweest voor Omoik. Het hielp me een platform te bouwen dat technisch sterk is, én daadwerkelijk nuttig voor klanten – of ze nu compliance, analyses of gewoon inzicht willen in het gedrag van hun bezoekers. Het mooiste? Klanten hoeven niet te weten dat Omoik gebouwd is met event sourcing – het werkt gewoon.

Ben je geïnteresseerd in privacyvriendelijke, controleerbare platforms of wil je ontdekken wat event sourcing voor jouw bedrijf kan betekenen? Neem gerust contact met me op via LinkedIn of stuur me een bericht!

Gepubliceerd op: July 3rd, 2025

Ik maak je bedrijf efficiënter met software die écht bij je past.

Klaar om je bedrijf efficiënter te maken? Laten we kennismaken.

Roelof Jan Elsinga

Blijf op de hoogte van mijn nieuwe blog posts

* indicates required

Please select all the ways you would like to hear from Roelof Jan Elsinga:

You can unsubscribe at any time by clicking the link in the footer of our emails.