⚡ Snel antwoord

De releasekalender van My Comics Collection wordt elke ochtend om 9u Parijse tijd bijgewerkt via een externe cron-job die de publieke API van Metron.cloud (licentie CC-BY-SA 4.0) raadpleegt. Het systeem synchroniseert nieuwe solicitations, werkt gewijzigde datums bij, downloadt ontbrekende covers naar een lokale schijfcache en stuurt intern een melding naar Premium-gebruikers van wie de pull list wordt beïnvloed.

De releasekalender berust op een architectuur met 4 technische lagen. Laag 1: Metron.cloud, de oorspronkelijke gegevensbron, een collaboratieve community-database die sinds 2018 de officiële solicitations van uitgevers verzamelt onder licentie CC-BY-SA 4.0. Laag 2: een externe cron-job gehost op cron-job.org (gratis dienst met een timeout van 30s) die elke ochtend om 9u00 Parijse tijd een specifiek endpoint van de My Comics Collection-API aanroept. Laag 3: de server-API die de nieuwe Metron-gegevens ophaalt via hun REST API, de MySQL-tabel upcoming_releases bijwerkt, en het asynchrone downloaden van ontbrekende covers activeert. Laag 4: de frontend van de applicatie die deze tabel bij elk bezoek van een gebruiker bevraagt om de bijgewerkte kalender te tonen.

De architectuur van het systeem: Metron → API → cache → gebruiker

Dit ontwerp met 4 lagen scheidt de verantwoordelijkheden netjes: Metron beheert de brongegevens (die we legaal gebruiken via hun licentie), de cron-job stuurt de frequentie (wij bepalen wanneer er gesynchroniseerd wordt), de server verzorgt de persistentie (MySQL-cache + schijf), en de frontend verzorgt de weergave. Als een van de lagen een tijdelijke storing heeft, blijven de andere gewoon functioneren — de MySQL-cache houdt de vorige gegevens vast, ook als Metron plat ligt, wat lege pagina's voorkomt.

De dagelijkse cron-job: waarom 9u Parijse tijd

De keuze voor 9u00 Parijse tijd (UTC+1 of UTC+2 in de zomer) beantwoordt aan meerdere operationele randvoorwaarden. (1) Tijdsverschil met de VS: 9u00 Parijse tijd komt overeen met 3u-4u New Yorkse tijd, wanneer de Amerikaanse uitgevers hun nachtelijke updates van de Metron-database hebben afgerond. Op dat tijdstip zijn de Metron-gegevens vers en stabiel voor de komende 24 uur. (2) Lage serverbelasting: 9u Parijse tijd valt nog in een rustige periode voor de meeste My Comics Collection-gebruikers, waardoor de cron-job niet hoeft te concurreren met piekverkeer van gebruikers. (3) Beschikbaarheid voor de rest van de dag: Franstalige gebruikers die de applicatie vroeg op de dag openen (8u-11u) zien een vers bijgewerkte kalender, wat de ervaren kwaliteit maximaliseert.

Eén uitzondering: voor gebruikers in Azië/Pacific die om middernacht Parijse tijd bezoeken (ochtend bij hen), kan de kalender nog gegevens van de vorige dag tonen, vóór de synchronisatie om 9u. Dit is een bewuste afweging: we optimaliseren voor de Franstalige EU-meerderheid in plaats van voor de APAC-minderheid.

De timeout van 30s en de asynchrone fire-and-forget-architectuur

Een technische beperking van de gratis dienst cron-job.org is de HTTP-timeout van 30 seconden. Als de My Comics Collection-server er langer dan 30s over doet om te antwoorden, beschouwt cron-job.org dit als een mislukking en stuurt het een foutmelding. De volledige Metron-synchronisatie (ophalen van 400+ solicitations, MySQL-update, downloaden van nieuwe covers) duurt echter doorgaans 2-5 minuten — ruim boven de timeout.

De architecturale oplossing: het endpoint pull_list_sync_async gebruikt een fire-and-forget-patroon via de PHP-functie fastcgi_finish_request(). Concreet: de server (1) ontvangt de cron-aanroep, (2) valideert het X-Sync-Token, (3) antwoordt met HTTP 200 in minder dan 100 ms, (4) sluit de HTTP-verbinding, en (5) zet de synchronisatiewerkzaamheden op de achtergrond voort. cron-job.org ontvangt zijn HTTP 200 binnen de timeout en is tevreden, terwijl de server de eigenlijke synchronisatie op zijn eigen tempo afrondt.

Dit patroon is elegant, maar heeft een beperking: als de synchronisatie stilletjes mislukt na het fire-and-forget-moment (MySQL-timeout, volle schijfruimte voor covers, enz.), weet cron-job.org dit niet. Om dit te ondervangen schrijft de server bij elke stap een logregel naar _logs/pull_list_cron.log, zodat achteraf te achterhalen is of een synchronisatie is mislukt.

De schijfcache voor covers: waarom en hoe

De comiccovers die van Metron worden opgehaald, worden opgeslagen in een lokale schijfcache op de server (map cache/metron_covers/). Deze cache is cruciaal voor de betrouwbaarheid van de weergave. Vóór de invoering van de cache (sprint v5.105, eind april 2026), werden covers rechtstreeks via de Metron-CDN aangeroepen — wat in de helft van de gevallen resulteerde in gebroken afbeeldingen door de hotlinking-beperkingen van die CDN.

Met de schijfcache verloopt het proces als volgt: (1) de synchronisatie-cron start het downloaden van ontbrekende covers via een PHP curl-commando; (2) elke cover wordt opgeslagen onder de naam {slug}.jpg op 300×450 pixels; (3) een HTTP-proxy aan de serverkant serveert deze bestanden via de URL /api.php?action=cover_proxy&slug=X, waardoor de Metron-CDN volledig wordt omzeild zodra de cover in de cache staat. Resultaat: weergavepercentage van covers > 99,5%.

Prestaties: wat kost een dagelijkse synchronisatie aan middelen

Voor de technisch nieuwsgierigen, hier de grootteorde van een typische dagelijkse synchronisatie in juni 2026: (1) Metron-aanroepen: 1 REST-aanroep per uitgever (~10 belangrijke uitgevers), oftewel 10 HTTP-verzoeken in minder dan 5 seconden; (2) gegevensvolume: 400-600 KB verwerkte JSON; (3) MySQL-query's: ~1.200 INSERT IGNORE-opdrachten (één per solicitation, idempotent) in minder dan 2 seconden; (4) downloaden van ontbrekende covers: doorgaans 20-50 nieuwe covers per dag, oftewel 1-3 MB gedownload in 30 seconden; (5) totale doorlooptijd: 2-5 minuten per dag; (6) maandelijkse kosten: marginaal (ruimschoots inbegrepen in de bestaande gedeelde OVH-hosting, geen meerkosten).

Deze zuinigheid maakt deel uit van de filosofie van My Comics Collection: de Pull List-functie wordt gratis aangeboden aan gebruikers zonder de algemene economie van de applicatie te schaden, omdat de marginale kosten verwaarloosbaar zijn. Premium financiert het onderhoud en de verdere ontwikkeling, niet het gratis raadplegen.