Kennisbank/Finance & settlements/Wisselkoersen: één API-call per dag, en een fallback die geen key nodig heeft
06Finance & settlements2 min lezen

Wisselkoersen: één API-call per dag, en een fallback die geen key nodig heeft

De dagelijkse refresh-job, de twee bronnen erachter, en de historiek die nog altijd weet welke koers er op een dinsdag in maart live stond.

Wisselkoersen zijn het soort infrastructuur waar niemand aan denkt tot een afrekening in dollar staat en iemand vraagt waar 1,0847 vandaan komt. Het antwoord van het platform is bewust klein: één job, één cache, één historiektabel en een adminpagina met drie knoppen erop.

Eén job, één keer per dag

Een cron roept /api/cron/refresh-rates aan om 07:00 UTC — 08:00 Midden-Europese tijd. Hij haalt de nieuwste EUR-gebaseerde koersen op, houdt alleen de paren over waarvan de valuta in de catalogus staat, en schrijft ze in de koerscache: één rij per valutapaar, vervangen bij elke refresh. Cross-currency-omrekeningen worden op runtime uit die EUR-paren berekend, en daarom dekt één API-call per dag elke tenant op het platform. Een knop Nu verversen bestaat voor de ochtenden waarop wachten tot morgen geen optie is.

Twee bronnen, waarvan één gratis

De primaire bron is ExchangeRate-API: 161 valuta’s, dagelijkse updates, en een API-key die het platformteam één keer bewaart. Zonder key — of wanneer de primaire call leeg terugkomt — valt de job door naar Frankfurter, die de referentiekoersen van de Europese Centrale Bank serveert: 31 valuta’s, dagelijks gepubliceerd om 16:00 CET, geen key nodig. De fallback is automatisch, en elke refresh registreert welke bron de cijfers effectief leverde, zodat een magere dag koersen zichzelf uitlegt in plaats van op een bug te lijken.

De schakelaar, en wat er gebeurt als hij uitstaat

/admin/exchange-rates is van het platformteam; alle anderen krijgen de pagina met beperkte toegang. Ze bevat de API-key, de schakelaar voor de automatische dagelijkse update, de handmatige refresh, en een samenvatting van hoeveel koersen er gecacht zijn, uit welke bron, en hoe lang geleden. Zet je de automatische update uit, dan blijft de cron niet stiekem ophalen: hij registreert een overgeslagen run met de reden en raakt niets aan. Een job die liegt dat hij uitstaat, is erger dan helemaal geen job.

Historiek, zodat een vastgezette koers verdedigbaar is

De cache bevat de koers van vandaag voor elk paar. Elke wijziging eraan wordt vastgelegd in een aparte, append-only historiek met een geldig-vanaf en een geldig-tot, en dat is wat iemand maanden later toelaat te reconstrueren welke koers op een bepaald moment live stond. Records die een koers vastzetten — een aanvaarde Market-deal, een afrekening — houden de koers die ze vastzetten, wat de feed daarna ook deed. De historiek bestaat voor het gesprek over de koers, niet om hem te wijzigen.