Adres
Utrecht, Veenendaal

Werktijden
Maandag tot en met vrijdag: 9.00 tot 17.00 uur
Weekend: 10.00 tot 17.00 uur

Een nieuwe event store voor het Qfact SaaS-platform, gebouwd samen met de softwarearchitect. Het bewaart business logic als events en geeft het platform een audit trail die voldoet aan de compliance-eisen van de overheid.

  • OpdrachtgeverQfact, een SaaS-platform voor complexe analyses
  • Periode2021
  • RolEngineer, samen met de softwarearchitect
  • WerkwijzeSCRUM, binnen het platformteam
  • Wat er veranderde, wanneer het veranderde en wat het veroorzaakte, zichtbaar voor elk record op het platform.
  • Ontworpen, gebouwd, gemigreerd en geïntegreerd in een platform dat de hele tijd bleef draaien.
  • Cassandra voor de event log, MongoDB voor de read models, RabbitMQ die de events tussen de services vervoert.

Context

Qfact draait een microservices SaaS-platform dat dagelijks door duizenden mensen wordt gebruikt voor complexe analyses. Onder de klanten zitten organisaties die zich over hun data moeten verantwoorden bij een toezichthouder. Daardoor is hoe een record er afgelopen maart uitzag, en wat het veranderde, een functionele eis en geen nice to have.

De uitdaging

Een platform dat de huidige staat opslaat, kan je vertellen wat waar is. Het kan je niet vertellen wat waar wás, of welke actie dat zo maakte, en geen enkele achteraf aangeplakte logging herstelt dat eerlijk. De store moest bovendien een live platform in: bestaande data moest erin worden overgezet, bestaande services moesten eruit gaan lezen, en geen van beide mocht het platform platleggen.

Wat ik deed

  • De store samen met de softwarearchitect ontworpen, vanuit het event model naar buiten toe. Wat telt als een event, wat een read model mag aannemen, en hoe een service zich abonneert zonder zich vast te koppelen aan de interne werking van een andere.
  • Op Cassandra gebouwd, voor de append only event log, waar schrijfdoorvoer en horizontale groei tellen en het herschrijven van geschiedenis geen feature is die iemand wil.
  • Read models geprojecteerd naar MongoDB, zodat de services daarboven de vorm konden opvragen die ze nodig hadden zonder elke keer de log opnieuw af te spelen.
  • Via RabbitMQ aangesloten, zodat events de services bereiken die er iets mee doen en niets hoeft te pollen.
  • De migratie en de integratie uitgevoerd, waarbij bestaande data erin werd verplaatst en services stapsgewijs werden omgezet, geleverd via SCRUM zodat elke stap zelfstandig live ging.

Het resultaat

  • Auditmogelijkheid die voldoet aan de compliance-eisen van de overheid, met volledig zicht op wat er veranderde, wanneer, en wat het veroorzaakte.
  • Een opslaglaag die schaalt op het schrijfpad, precies waar een event log echt op de proef wordt gesteld.
  • Geïntegreerd in het bestaande platform zonder de operatie of de uptime te verstoren.

Gebruikte technologieën

  • Node.js: De event store services.
  • TypeScript: De taal in al die services.
  • Event sourcing: Het patroon waarop de hele store is gebouwd.
  • Cassandra: De append only event log.
  • MongoDB: De read models die uit die log worden geprojecteerd.
  • RabbitMQ: Aflevering van events tussen services.
  • GraphQL: De API-laag over het platform.
  • OAuth 2.0: Autorisatie op de platform-API's waarmee de store benaderd wordt.
  • Jest: Geautomatiseerde tests rond de store en de projecties ervan.
  • SCRUM: Hoe ontwerp, bouw, migratie en integratie werden opgeleverd.

Event sourcing betaalt zich juist terug waar een audit trail vereist is, en ik geef graag aan waar dat volgens mij niet zo is.