NS werkt momenteel aan een grote verandering in de manier waarop treinkaartjes worden geprijsd. Waar tarieven lange tijd vooral statisch en uniform waren, bouwt de organisatie nu aan een serverless inventarissysteem dat real-time inzicht geeft in de capaciteit en prijzen per trein. Daarmee worden zogeheten NS PrijsTijd Deals dynamisch geprijsd: kaartjes met korting voor treinen op specifieke tijden, bedoeld om drukte te spreiden. In een nieuwe editie van het webinar ‘Tweakers op Stoom’ laat NS zien hoe dit in de praktijk werkt: van een stateless microservices-landschap naar een deels event-gedreven, stateful oplossing bovenop AWS.
Didi de Jong is werkzaam als software engineer in het team Microservices Reizen en Prijzen (MRP), dat alle reis- en prijsinformatie voor interne en externe afnemers van NS via ontsluit via api’s. “Elke keer dat je de reisplanner opent en een prijs ziet, komt die uit onze api’s,” vertelt Didi. “We verwerken miljoenen requests per dag. Die performance en betrouwbaarheid moeten we houden, ook nu we naar dynamische kortingen gaan.”
IT-banen bij de NS
Het MRP-team beheert alles wat met prijzen, abonnementen en kaartsoorten heeft te maken, en stelt die gegevens beschikbaar aan andere NS-systemen en partners. Tot nu toe gebeurde dat met grotendeels statische logica: een vast tarief, bekende kortingsproducten zoals dalurenkorting, en duidelijke regels voor korting.
De nieuwe stap is een wezenlijke verandering. NS wil dynamische korting kunnen aanbieden, vooral aan incidentele reizigers en dagjesmensen die zonder abonnement reizen. Denk bijvoorbeeld aan iemand die doordeweeks naar de Randstad afreist voor een museumbezoek of concert.
“Wat verandert, is dat we de korting veel slimmer gaan inzetten om drukte te spreiden”
“De basis blijft hetzelfde: we hebben een vol tarief, en daar bovenop geven we korting”, legt Didi uit. “Wat verandert, is dat we die korting veel slimmer gaan inzetten om drukte te spreiden. Als we weten dat een trein erg vol wordt, willen we reizigers verleiden net iets eerder of later te reizen, door een aantrekkelijker prijskaartje aan te bieden.”
Belangrijk daarbij: dynamische prijzen betekenen geen stiekeme prijsverhogingen per trein. “Wij mogen alleen korting geven”, benadrukt Didi. “De dynamische prijzen zijn altijd een korting op de volle prijs. Het doel is vooral om drukte en capaciteit beter te sturen.”
Event-gedreven microservices voor dynamische kortingen
Onder de motorkap bouwt NS een inventarissysteem dat als een soort spiegel van de centrale revenue-managementoplossing fungeert. Dat systeem bepaalt op hoog niveau welke prijsniveaus en kaartjes er zijn. De MRP-microservices leiden daaruit af welke prijstijddeal-kaartjes per trein, per traject en per tijdstip nog beschikbaar zijn.
Technisch is gekozen voor een serverless architectuur op AWS, met:
- Java-microservices die de businesslogica bevatten op AWS Lambda, ontsloten via API Gateway om schaalbaar en kostenefficiënt te draaien.
- DynamoDB als snelle, horizontaal schaalbare databron voor voorraadinformatie.
- Queues en topics (event-driven messaging) om grote hoeveelheden berichten en events robuust te verwerken.
Deze event-gedreven aanpak zorgt dat wijzigingen - nieuwe prijsstrategieën, verkochte kaartjes - met minimale vertraging worden doorgegeven. De inventaris-‘spiegel’ blijft zo continu gesynchroniseerd met de revenue-managementlaag, terwijl de bestaande MRP-api’s voor de buitenwereld gewoon beschikbaar en consistent blijven.
“Voor de reisplanner en andere afnemers verandert het contract zo min mogelijk”, zegt Didi. “Zij vragen om een prijs, wij geven een prijs terug. Het verschil zit vooral onder water: daar gebeurt straks veel meer, op een manier die veel dynamischer is.”
De grootste inhoudelijke omslag voor het team zit niet in de keuze voor serverless of DynamoDB, maar in de stap van stateless naar stateful werken. “Tot nu toe waren we volledig stateless”, aldus Didi. “We kregen een request, maakten een berekening op basis van tariefregels, en gaven een prijs terug. Voor iedereen gold in principe dezelfde prijs voor een bepaald traject en product.”De toegepaste architectuur wordt een voortdurende afweging tussen snelheid, resilience en nauwkeurigheid
De toegepaste architectuur hiervoor wordt een voortdurende afweging tussen snelheid, resilience en nauwkeurigheid. Hoeveel caching is acceptabel? Hoe ga je om met vertraagde events? Hoe zorg je voor goede schaling bij piekbelasting? Hoe ga je om met ontbrekende of vertraagde events? Hoe zorg je dat asynchrone flows goed getest worden? Het is precies dat soort vragen waar Didi tijdens het webinar op ingaat.
Wiremind, KMS en encryptie
Voor de dynamische prijslogica werkt NS samen met de Franse partij Wiremind, gespecialiseerd in revenue management en prijsoptimalisatie.
“Wiremind levert een lerend systeem dat uiteindelijk zelfstandig prijzen gaat bepalen”, legt Didi uit. “In het begin vullen de marketeers allerlei regels in: welke treinen willen we stimuleren, welke juist niet, en hoe ver voor vertrek mag je nog boeken? Op termijn gaat het systeem daarvan leren, zodat het steeds slimmer kaarten en prijzen kan toekennen.” Toen duidelijk werd dat NS met Wiremind in zee ging, vertrok een deel van het MRP-team naar Parijs om een paar dagen intensief te sparren. Welke data is nodig? Welke api’s zijn er? Hoe houd je de twee systemen logisch gelijk?
“Vanaf dag één zijn we samen gaan uittekenen hoe de integratie eruit moest zien”, vertelt Didi. “Nu werken we nauw samen: wij leveren stap voor stap de benodigde endpoints, zij sluiten aan, en we testen continu of de data klopt. Het is echt een co-creatie.”
Naast de functionele en architecturale keuzes zijn er de onvermijdelijke praktische lessen. Een sprekend voorbeeld is de manier waarop prijzen worden vastgelegd in tokens.
“We wilden zeker weten dat een kaartje uiteindelijk verkocht wordt voor de prijs die we in eerste instantie hebben afgegeven”, aldus Didi. “Daarom genereren we een versleutelde token waarin de relevante prijsinformatie zit. Het idee was om daarvoor AWS KMS te gebruiken.”
In de praktijk bleken de kosten daarvan echter fors. “Na livegang zagen we opeens dat onze AWS-kosten met ongeveer honderd dollar per dag waren gestegen, puur door KMS-calls. Dankzij een alert uit de centrale platformorganisatie hadden we dat snel door. We hebben de oplossing aangepast: we doen de encryptie nu zelf en houden de kosten weer behapbaar.”
Dat is meteen een voorbeeld van de samenwerking met de platformorganisatie. Waar het MRP-team ooit als ‘first mover’ zelf naar AWS ging en zijn eigen infrastructuur optuigde, wordt nu steeds meer gebruikgemaakt van gestandaardiseerde oplossingen voor CI/CD en cloudinrichting – zoals de overgang van Jenkins naar Azure DevOps. Didi: “Dat maakt dat wij ons kunnen focussen op onze businesslogica en het goed leveren van prijzen. We hoeven het wiel niet overal opnieuw uit te vinden.”
Voor wie is het webinar interessant?
Volgens Didi is het aankomende webinar interessant voor iedereen die wil weten hoe je dynamische prijsmechanismen in een bestaande, grootschalige omgeving inbouwt, zonder je bestaande api-contracten te breken of je performance om zeep te helpen. Ze noemt:
- Backend- en serverless-engineers die met AWS, event-driven architectuur en DynamoDB werken.
- Architecten die worstelen met de stap van stateless naar stateful systemen op grote schaal.
- Product owners en marketeers die willen begrijpen wat er technisch komt kijken bij dynamische prijsstelling en capaciteitsspreiding.
“En natuurlijk is het interessant voor de gemiddelde tweaker die een kijkje wil krijgen in de keuken van een grote, complexe IT-organisatie waar keuzes over architectuur, schaalbaarheid en kosten elke dag voelbaar zijn, tot in de prijs van een treinreis aan toe.”
Didi verzorgt daarmee het tweede deel van het webinar. Tijdens het eerste deel zullen Bas en Johan de vertaalslag van ‘platform engineering’ naar praktische uitvoering maken. Bas schetst daarbij de Developer Journey en hoe die uitmondt in een developer-platform met selfservice. Johan laat in een demo zien hoe een pipeline is opgebouwd uit bricks, hoe je een brick met één regel aanroept en wat het verschil in snelheid en feedback is tussen ‘oude’ en ‘nieuwe’ pipelines. Over hun specifieke deel lees je meer in een eerder gepubliceerd artikel.
Meld je aan voor het webinar ‘Tweakers op Stoom’
Het webinar is op 11 maart, start om 19.00 en duurt ongeveer anderhalf uur. Er is ruim voldoende tijd om inhoudelijke vragen te stellen, zodat je alle ins & outs meekrijgt. Meld je hier aan voor het webinar ‘Tweakers op Stoom’.
Aanmelden Tweakers op Stoom NS webinar
Dit artikel is geen redactioneel artikel, maar gesponsord en tot stand gekomen dankzij NS en Tweakers Partners. Tweakers Partners is de afdeling binnen Tweakers die verantwoordelijk is voor commerciële samenwerkingen, winacties en Tweakers events zoals meet-ups, Developers Summit, Testfest en meer. Bekijk hier het overzicht van alle acties en events. Mocht je ideeën met ons willen delen over deze vorm van adverteren, dan horen wij dat graag. Hierover kun je met ons in gesprek via [Discussie] Reclame algemeen].