Skip to main content

Performance, beschikbaarheid en fallbackgedrag

22.1 Doel en scope

Dit hoofdstuk beschrijft hoe OefenHub technisch omgaat met performance, beschikbaarheid, degradatie en fallbackgedrag binnen de gekozen middel-zware modulaire monoliet.

De uitgangspunten uit de Software Requirements Specification en architectuur blijven leidend. Dit hoofdstuk voegt geen nieuwe functionele eisen toe, maar vertaalt bestaande niet-functionele verwachtingen naar technische ontwerpkeuzes, meetpunten en implementatieafspraken.

Performance en beschikbaarheid worden niet opgelost door modulegrenzen te doorbreken. Ook onder belasting blijven de basisregels gelden:

  • OefenHub.Web gebruikt publieke modulecontracten en geen directe DbContext- of entitytoegang.
  • Module-eigen data blijft eigendom van de module die het bijbehorende schema beheert.
  • Readmodels, caching en materialisatie zijn optimalisatielagen en geen bron van waarheid.
  • Fallbackgedrag mag nooit autorisatie, privacy, relatiegrenzen of historische brondata omzeilen.
  • SignalR, caching, PDF-bestanden en tijdelijke exportbestanden zijn transport- of afgeleide lagen, geen primaire brondata.

22.2 Relatie met andere hoofdstukken binnen het Technisch Ontwerp

Technisch Ontwerp-hoofdstukRelatie met performance en fallback
02 Architectuuroverzicht en solution-opbouwBepaalt de modulaire monoliet, projectindeling en runtimecontext.
03 Applicatielagen, projectstructuur en dependency-richtingBepaalt waar performanceoptimalisatie mag plaatsvinden zonder dependencyregels te schenden.
07 Databaseontwerp, migraties, seeddata en constraintsBepaalt indexen, querygrenzen, schema-eigenaarschap en soft link/snapshotgedrag.
15 Realtime live meekijken met SignalRBepaalt live-updategedrag, reconnect en live-fallback.
16 PDF-export met QuestPDFBepaalt PDF-rendering, tijdelijke bestanden en export-fallback.
17 Readmodels, tellers, badges, caching en materialisatieBepaalt caching, readmodelactualiteit en tellerfallback.
18 Background jobs, TickerQ en periodieke verwerkingBepaalt retrybare naverwerking, jobstatussen en periodieke herstelacties.
19 Logging, audit, securitylogging en technische foutafhandelingBepaalt correlation, foutregistratie en veilige foutrespons.
20 Security, infrastructuur, secrets en omgevingenBepaalt pipeline, headers, rate limiting, secrets en securitygrenzen.
21 Beheerbeleid, monitoring, backup, restore en operatieBepaalt operationele monitoring, health checks, incidentafhandeling en herstelprocedures.
23 Teststrategie, acceptatieherleidbaarheid en kwaliteitsgrenzenBepaalt loadtests, integratietests en kwaliteitsgrenzen.

22.3 Performanceprincipes

OefenHub hanteert de volgende technische performanceprincipes:

PrincipeToelichting
Server-side autorisatie eerstQueries worden altijd server-side gescoped voordat data wordt opgehaald of gepresenteerd.
Brondata blijft leidendCaches, readmodels en badges mogen brondata versnellen, maar niet vervangen.
Meetbaar boven implicietPerformancegrenzen worden gekoppeld aan meetpunten, logging en tests.
Geen stille onvolledigheidFallback mag een veilige lege toestand tonen, maar geen misleidende nulwaarden.
Bounded queriesOverzichten gebruiken paginering, filters en expliciete limieten.
Module-eigen optimalisatieEen module optimaliseert eigen queries, indexes, readmodels en caching.
Cross-module compositie via contractsSamengestelde schermen vragen data via publieke query-services, niet via directe databasejoins over modulegrenzen.
Asynchroon waar veiligNiet-kritieke naverwerking mag via Scheduling/TickerQ verlopen, mits idempotent en beheerbaar.
Snel falen waar nodigBij ongeldige context, ontbrekende autorisatie of kritieke dependency-fout wordt veilig en duidelijk gefaald.

22.4 Prestatiecategorieën

Niet iedere functie heeft dezelfde performance-eisen. Het Technisch Ontwerp onderscheidt daarom categorieën.

CategorieVoorbeeldenTechnische benadering
Interactieve UInavigatie, frontpages, overzichten, detailpagina’skorte requestduur, bounded queries, readmodels waar nuttig
Kritieke commandsoefening starten, antwoord verwerken, relatie accepteren, ticket sluitentransactioneel betrouwbaar, geen zware bijtaken in de requestflow
Realtime transportlive meekijken, badges, online-statuskleine payloads, reconnect, bronherstel vanuit database
Zware outputPDF-export, grote geschiedenisoverzichtenstreaming/tijdelijke output, limieten, eventueel jobmatige verwerking
Periodieke verwerkingcleanup, verlopen uitnodigingen, verlopen heropentermijnenTickerQ, idempotentie, retries, monitoring
Beheeranalysebeheerlogs, history, supportanalysepaginering, filters, indexen, geen onbeperkte exports in UI

22.5 Richtwaarden en meetpunten

De V1.0-baseline gebruikt bewuste, lichte performancegrenzen. OefenHub is geen grootschalige 24/7-applicatie en krijgt geen top-tier latency- of beschikbaarheidsdoelen. De grenzen hieronder zijn technische ontwerp- en testwaarden voor een acceptabele gebruikerservaring bij representatieve belasting, niet een externe SLA.

De meting gebruikt waar mogelijk de 95e percentielwaarde (p95) in een representatieve test- of acceptatieomgeving met realistische testdata, een warme applicatie en normale netwerkcondities. Externe identity-providerlatency, browserextensies, lokale apparaatvertraging en internetstoringen vallen buiten deze richtwaarden.

OnderdeelMeetpuntTechnische aandacht
Frontpage ladenrequestduur, querytijd, aantal modulecallspage composition mag geen onbegrensde cross-module cascade worden
Oefening startencommandduur, modulegeneratietijd, databasecommitvraaggeneratie en runopslag moeten binnen één veilige startflow passen
Antwoord bevestigenverwerkingstijd, commitduur, SignalR-publicatietijddatabasecommit is leidend; SignalR is vervolgtransport
Geschiedenisoverzichtquerytijd, paginagrootte, indexgebruikalleen afgeronde toegestane runs ophalen
Resultaatdetaillaadtijd, payloadgrootte, module-renderhulppayload parsing begrenzen en fouten veilig afhandelen
PDF-exportrenderduur, bestandsgrootte, geheugengebruiktijdelijke opslag, time-outs en cleanup verplicht
Live meekijkenupdate-latency, reconnecttijd, stale-state herstelreconnect haalt actuele voortgang opnieuw uit Practice
Badges/tellersactualiteit, queryduur, cache-hitratiobadges mogen tijdelijk achterlopen, niet brondata wijzigen
Jobswachttijd, pogingen, foutpercentageCorrelationId, JobId en failed-status verplicht
Login/provisioningprovider-retourduur, interne contextopbouwproviderlogin is pas bruikbaar na interne accountcontrole

22.5.1 V1.0-performancegrenzen per hoofdflow

De volgende waarden sluiten het open punt over performancegrenzen per hoofdflow af. Zij zijn bedoeld als realistische kwaliteitsgrens voor een kleine tot middelgrote applicatie. Een incidentele overschrijding is geen architectuurincident, maar structurele overschrijding vraagt analyse van query's, indexen, readmodels, caching, paginering of jobmatige verwerking.

HoofdflowV1.0-richtwaardeMeetpuntAfbakening
Login afronden en interne gebruikerscontext opbouwenp95 ≤ 3 s na terugkomst van de identity providerinterne contextresolving, accountstatuscontrole, rolcontextexterne providerlatency valt buiten de meting
Normale navigatie, frontpage en dashboardblokken ladenp95 ≤ 4 sserverrequest plus eerste benodigde page-compositiondataafbeeldingen, browserrendering en externe netwerkvertraging vallen buiten de servermeting
Overzicht openen, filteren of sorterenp95 ≤ 4 s voor de eerste paginaquerytijd, filtervalidatie, page viewmodelalleen server-side paginering; geen onbeperkte lijsten
Detailpagina openenp95 ≤ 4 squerytijd en detail-viewmodelzware subdetails mogen lazy geladen worden
Oefening startenp95 ≤ 4 smodulevalidatie, runaanmaak, eerste vraag/contextzeer zware modulegeneratie moet worden begrensd of voorbereid
Antwoord bevestigen binnen een oefeningp95 ≤ 2 svalidatie, opslag, score-/voortgangsupdateSignalR-publicatie is vervolgtransport en mag niet de commit blokkeren
Relatie-, autorisatie-, bericht- of ticketactie uitvoerenp95 ≤ 3 scommandvalidatie, autorisatie, transactiecommitniet-kritieke badges/notificaties mogen retrybaar of asynchroon zijn
Geschiedenis- of resultaatdetail openenp95 ≤ 5 stoegangscontrole, query, payloadvalidatie, viewmodelgrote historie gebruikt filters, paginering en geen volledige dataset in één response
Ouder-/voogd- en docentresultaatsamenvattingen ladenp95 ≤ 5 sreadmodel/query, contextscope, aggregatiesamenvattingen mogen cache of readmodel gebruiken, brondata blijft leidend
Live meekijkupdate zichtbaar makenp95 ≤ 3 s na opgeslagen voortgangpublish-latency en clientupdatereconnectbaseline: 0, 2, 10, 30 en 60 seconden met maximaal 5 automatische pogingen
Badges en tellers verversenmaximaal 5 min achterstandreadmodel/cache-actualiteitbadges mogen tijdelijk achterlopen en zijn nooit bron van waarheid
PDF-export voor normale resultaatsetsp95 ≤ 60 sexportmodel ophalen, renderen, tijdelijk bestand registrerengrote of uitzonderlijke exports krijgen veilige fout, limiet of jobmatige verwerking
Beheercontent, instellingen, features of modulebeheer opslaanp95 ≤ 4 svalidatie, autorisatie, audit/history, transactiecommitpreview/rendering mag apart worden uitgevoerd
Beheeranalyse, logs en supportoverzichten openenp95 ≤ 8 sgefilterde query, paginering, audit-/supportviewmodelbrede analyse vereist filters; onbeperkte exports zijn geen V1.0-uitgangspunt
Niet-kritieke achtergrondverwerking zichtbaar verwerkenbinnen de geconfigureerde jobinterval, normaal ≤ 15 minjoblatency, failed-status, retrybare side-effectsretrydefaults per jobtype volgen de vastgelegde defaultmatrix in hoofdstuk 18

Deze grenzen zijn niet bedoeld om dure high-performance-infrastructuur af te dwingen. Wanneer een flow structureel buiten de richtwaarde valt, wordt eerst gekozen voor bounded queries, indexes, kleinere payloads, paginering, readmodels, caching of asynchrone naverwerking binnen de bestaande modulaire monoliet.

22.6 Performance per applicatielaag

22.6.1 Web/UI-laag

OefenHub.Web is verantwoordelijk voor responsieve UI-compositie, maar niet voor domeinlogica of directe dataoptimalisatie.

Technische regels:

  • Componenten vragen data op via publieke query-services of page composition services.
  • Pagina’s laden alleen data die voor de eerste weergave nodig is.
  • Zware details worden pas opgehaald na expliciete selectie.
  • Tabellen en overzichten gebruiken paginering, filtering en server-side sortering.
  • UI-loadingstates mogen geen autorisatiebeslissingen maskeren.
  • Browserstate mag performance ondersteunen, maar nooit autorisatie, rolcontext of objecttoegang bepalen.

Voorbeeld:

Docentfrontpage
Web/PageComposition
→ Catalog query-service voor niveaus en oefenaanbodsummary
→ Practice query-service voor relevante samenvattingswaarden
→ Support query-service voor actie-indicatoren
Web composeert viewmodel
Web voert geen directe databasequery uit

22.6.2 Modulelaag

Elke module is verantwoordelijk voor performance binnen de eigen brondata en eigen schema.

ModulePerformancefocus
Identitysnelle interne accountlookup na providerlogin, accountstatuscontrole
Authorizationcontextresolving, policy-evaluatie, objecttoegang zonder brede queries
Relationshipsrelatiechecks, uitnodigingstatussen, conflictdetectie
Catalogtoegankelijke niveaus/categorieën/oefeningen, modulemetadata, configuratievalidatie
Practicerunstart, antwoordverwerking, geschiedenis, statistieken, snapshotdata
Communicationmailboxoverzicht, badges, readstate, notificaties
Supportticketoverzichten, statusfilters, discussie en history
LiveMonitoringlivebeschikbaarheid, auditstart/einde, presence-informatie
Reportingexportmodel ophalen en PDF-rendering orkestreren
Schedulingjobselectie, retries, failed-statussen, dashboarddata
Adminbeheercontent, templates, instellingen en beheerhistory

22.6.3 Databaselaag

Performance in de database wordt module-eigen ontworpen.

Technische regels:

  • Elke module beheert eigen indexen vanuit eigen querypatronen.
  • Cross-module directe joins zijn geen standaard optimalisatiepad.
  • Soft links worden querymatig gevalideerd via modulecontracts, niet via willekeurige joins.
  • Overzichten lezen bij voorkeur uniforme kolommen/readmodels in plaats van grote payloads.
  • JSON/base64-payloads worden niet gebruikt als standaard filter- of sorteerbron.
  • Tabellen met verwachte groei krijgen vanaf het ontwerp aandacht voor indexen, paginering en cleanup.

Voorbeelden van groeigevoelige tabellen:

DomeinVoorbeeldenPerformance-aandacht
practiceExerciseRuns, ExerciseRunProgress, gedeelde oefeningenfiltering op gebruiker, niveau, oefening, status en afrondmoment
communicationsysteemberichten, privéberichten, readstatemailboxqueries, ongelezenbadges, retentie privéberichten
supporttickets, discussies, historystatusfilters, actie-indicatoren, beheerzoeken
liveLiveViewAudit, presence/readmodelsactieve sessies versus historische audit
schedulingTickerQ/jobtabellenpending/failed/selectie op due time en status

22.7 Beschikbaarheidsprincipes

Beschikbaarheid betekent binnen OefenHub niet dat elke onderliggende functie altijd volledig bruikbaar moet blijven. Het betekent dat de applicatie veilig, voorspelbaar en herstelbaar reageert wanneer een dependency of deelproces faalt.

SituatieGewenst gedrag
Identity provider niet beschikbaarGeen nieuwe login; bestaande sessies blijven alleen bruikbaar zolang zij geldig en veilig zijn.
Database niet beschikbaarGeen bronmutaties; gebruiker krijgt veilige foutafhandeling.
SignalR tijdelijk verbrokenLiveweergave probeert reconnect en haalt actuele voortgang opnieuw uit Practice.
TickerQ/jobverwerking vertraagdJobs blijven persistent pending; beheer kan status zien.
PDF-rendering faaltGeen half bestand aanbieden; fout loggen met correlation-id.
Readmodel achterhaaldIndien veilig: bronquery of melding dat gegevens worden bijgewerkt; geen misleidende nulwaarde.
Externe of interne notificatie vertraagdAfhankelijk van workflow: retrybaar of kritieke transactie faalt.
Cache niet beschikbaarTerugvallen op bronquery wanneer dit veilig en performant verantwoord is.

22.8 Fallbackclassificatie

Fallbackgedrag wordt per functionaliteit geclassificeerd.

KlasseBetekenisVoorbeeld
Geen fallbackActie mag niet doorgaan zonder dependencynieuwe login zonder identity provider
Veilige foutresponsActie stopt en toont generieke foutdatabasecommit faalt
BronfallbackReadmodel/cache faalt, brondata wordt gelezenbeperkte geschiedenisquery vanuit Practice
Retrybare naverwerkingActie is niet direct vereist voor gebruikersuitkomstcleanup, badge-refresh, niet-kritieke notificatie
Kritieke transactieMeerdere stappen moeten samen slagenrelatie-uitnodiging met primaire systeemberichtingang
Degraded viewUI toont beperkte maar correcte informatielive reconnect toont laatst bekende status met herstelpoging
Beheerbare failed-statusProces stopt veilig en vraagt beheeranalysejob overschrijdt retrylimiet

22.9 Geen misleidende fallback

OefenHub mag bij storing of ontbrekende data geen waarden tonen die functioneel onjuist lijken.

Niet toegestaan:

- teller op 0 zetten wanneer query is mislukt
- lege geschiedenis tonen zonder onderscheid tussen “geen resultaten” en “niet beschikbaar”
- oude autorisatiecontext gebruiken omdat actuele controle faalt
- PDF genereren met ontbrekende vraagdetails zonder duidelijke fout
- live meekijken voortzetten alsof de leerling nog actief is terwijl de bronstatus onbekend is

Wel toegestaan:

- veilige foutmelding zonder technische details
- melding dat gegevens tijdelijk niet beschikbaar zijn
- lege toestand wanneer server-side is vastgesteld dat de dataset echt leeg is
- readmodel opnieuw opbouwen vanuit brondata
- failed job zichtbaar maken voor beheer

22.10 Fallback per domein

22.10.1 Identity en login

Login is afhankelijk van de externe identity provider en interne OefenHub-contextopbouw.

FoutscenarioGedrag
Identity provider onbereikbaarNieuwe login of registratie faalt veilig; geen lokale credentialfallback.
Providerlogin gelukt, interne provisioning faaltGeen reguliere sessie; generieke accountfout/contactroute.
Interne accountstatus inactiefToegang blokkeren; geen frontpage of rolcontext.
Rolcontext ontbreektBeperkte veilige context zonder impliciete rolrechten.
Pending invitation reconciliation faaltProvisioning mag alleen slagen wanneer de noodzakelijke kritieke stappen correct zijn afgehandeld of veilig retrybaar zijn gemaakt.

22.10.2 Authorization en objecttoegang

Autorisatiefallback is strikt.

  • Bij twijfel wordt toegang geweigerd.
  • Een niet-beschikbare autorisatiebron leidt niet tot ruimere toegang.
  • Oude clientstate wordt niet gebruikt als fallback.
  • Een fout in objecttoegangscontrole toont geen gedeeltelijke objectdata.
  • Access-denied logging mag geen gevoelige payloads bevatten.

22.10.3 Catalog

Catalogusdata bepaalt wat leerlingen, docenten en beheerders mogen zien of configureren.

Fallbackregels:

  • Als modulemetadata niet geladen kan worden, wordt configureren/testen/starten veilig geblokkeerd.
  • Als een categorie-/oefeningquery faalt, toont Web geen lege “alles is weg”-toestand zonder foutcontext.
  • Historische runweergave gebruikt snapshots vanuit Practice wanneer actuele catalogusdata niet meer passend is.
  • Categorie- of modulemigratie mag historische runs niet onleesbaar maken.

22.10.4 Practice

Practice is bron van oefenruns, voortgang, resultaten en geschiedenis.

Fallbackregels:

  • Antwoordverwerking moet bronmutatie betrouwbaar committen voordat vervolgtransport plaatsvindt.
  • SignalR-fouten mogen antwoordopslag niet terugdraaien wanneer de databasecommit geslaagd is.
  • Niet-afgeronde runs blijven herstelbaar zolang de opgeslagen voortgang geldig is.
  • Resultaatweergave gebruikt opgeslagen runvelden en payloads; geen clientstate-fallback.
  • Geschiedenis toont alleen server-side geautoriseerde afgeronde runs.

22.10.5 Communication

Communicatie kent kritieke en niet-kritieke berichten.

CommunicatiestapMogelijk beleid
Systeembericht als primaire ingangkritisch, atomair met bronworkflow waar nodig
Badge-updateafgeleid/retrybaar
Niet-kritieke notificatieretrybaar met begrensde pogingen
Maildispatch na bronmutatiebronmutatie blijft leidend; mailfout wordt herleidbaar en eventueel retrybaar gemaakt
Privébericht verzendencommand moet slagen of falen; geen half zichtbaar bericht
Thread-eventonderdeel van threadmutatie en readstatebeleid

Tijdens actieve leerling-oefeningen worden badges en notificatie-indicaties visueel uitgesteld, maar server-side readstate en berichten blijven correct opgeslagen.

Mailfouten mogen de gebruiker niet misleiden over de status van de bronactie. Wanneer een domeinactie succesvol is vastgelegd maar e-maildispatch faalt, toont de applicatie de status van de domeinactie volgens de brondata en wordt de mailfout technisch herleidbaar en waar toegestaan retrybaar verwerkt. Wanneer e-mail functioneel kritiek is voor het bereiken van de ontvanger, bepaalt de workflow of de mailaanvraag binnen de kritieke transaction boundary valt.

22.10.6 Support

Ticketflows kunnen meerdere domeinen raken. Per workflow wordt bepaald welke stappen kritiek zijn.

Voorbeelden:

WorkflowKritiekMogelijk retrybaar
Nieuwe melding makenticket + eerste history/discussie volgens domeinregelsysteembericht wanneer niet primaire ingang of veilig retrybaar gemaakt
Aanvullende informatie vragenstatuswijziging + extern bericht wanneer dit de actie bepaaltbadge/readmodel
Oplossing plaatsenclosure + status/historynotificatie als niet de enige ingang is
Doorzetten naar docentsupportsluiting + forwardregistratie + noodzakelijke communicatie volgens workflowdefinitieaanvullende badges/readmodels

22.10.7 LiveMonitoring en SignalR

Live meekijken moet herstellen vanuit brondata.

Fallbackregels:

  • SignalR reconnect haalt actuele voortgang opnieuw op via Practice.
  • Stale clientstate wordt niet als bron gebruikt.
  • Bij reconnect-falen eindigt de liveweergave veilig en wordt LiveViewAudit waar nodig afgesloten.
  • Browse-modus is lokale UI-state en mag livebrondata niet wijzigen.
  • Online-status is afgeleid en mag niet als autorisatiebewijs gelden.

22.10.8 Reporting en PDF

PDF-export mag geen half of onjuist document aanbieden.

Fallbackregels:

  • Export gebruikt een server-side geautoriseerd exportmodel.
  • Tijdelijke bestanden worden pas aangeboden na succesvolle render.
  • Bij renderfout wordt geen gedeeltelijk PDF-bestand aangeboden.
  • Module-specifieke rendering mag fallbacktekst leveren voor bekende veilige representaties, maar niet stilzwijgend inhoud weglaten.
  • Oude tijdelijke bestanden zijn niet de bron; download wordt opnieuw opgebouwd uit databasegegevens en snapshots.

22.10.9 Scheduling

Jobs zijn persistent en beheerbaar.

Fallbackregels:

  • Een app-herstart mag pending jobs niet verliezen.
  • Retries zijn begrensd per jobtype.
  • Na overschrijding van retrylimiet eindigt de job in een failed-status.
  • Failed jobs zijn zichtbaar voor interne beheeranalyse.
  • Domeinacties binnen jobs moeten idempotent zijn of expliciet beschermd tegen dubbele uitvoering.
  • Multi-domain jobs leggen per jobtype vast of atomaire uitvoering, compensatie of failed-status nodig is.

22.11 Time-outs en limieten

Time-outs voorkomen dat één zware actie de applicatie onnodig blokkeert. De waarden hieronder zijn V1.0-bovengrenzen voor implementatie en testinrichting; zij vervangen geen functionele validatie of autorisatiecontrole.

OnderdeelTechnische regelV1.0-grens
HTTP-requestsCommands blijven bounded; zware naverwerking waar mogelijk buiten requestflow.normale interactieve request-time-out ≤ 30 s
DatabasequeriesOverzichten gebruiken limieten, paginering en server-side filters.querycommand-time-out ≤ 30 s; streefwaarde per hoofdflow volgens 22.5.1
OverzichtspagineringEerste weergave gebruikt server-side paginering.standaard 25 regels, configureerbaar tot maximaal 100 regels per pagina
Zoek-/filterveldenFilteren gebeurt server-side en bounded.minimale debounce of expliciete zoekactie; geen query per toetsaanslag zonder begrenzing
PDF-exportRenderduur en bestandsgrootte krijgen technische limieten.normale export p95 ≤ 60 s; absolute requestgrens ≤ 120 s; grotere exports beperken of jobmatig verwerken
SignalRReconnectpogingen zijn begrensd; daarna veilige beëindiging.update p95 ≤ 3 s; reconnectbaseline: 0, 2, 10, 30 en 60 seconden; daarna veilige verbroken status
JobsPer jobtype retry- en executionlimieten vastleggen.niet-kritieke side-effects normaal binnen 15 min zichtbaar of failed beheerbaar
Rich text sanitizingMaximale berichtgrootte en verwerkingslimieten toepassen.concrete tekstlengtes per veld in validatie/configuratie vastleggen
Payload parsingJSON/base64-payloads valideren op grootte, versie en vorm.payloadgrootte per module expliciet begrenzen; geen onbeperkte parsing in requestflow

Limieten mogen per module strenger worden gemaakt wanneer dat functioneel of technisch nodig is. Verruiming boven deze baseline vereist een bewuste ontwerp- of implementatiekeuze met aandacht voor memorygebruik, databasebelasting, logging en gebruikersfeedback.

22.12 Capaciteit en schaalbaarheid binnen fase 1

OefenHub schaalt in de eerste baseline primair als één deploybare applicatie met één database. De modulegrenzen zijn bedoeld om onderhoudbaarheid en toekomstige schaalopties te verbeteren, niet om in fase 1 al microservices te introduceren.

Schaalprincipes:

  • Optimaliseer eerst queries, indexen, readmodels en caching binnen de monoliet.
  • Houd payloads klein bij realtime updates.
  • Maak zware output tijdelijk en cleanupbaar.
  • Gebruik module-eigen readmodels voor veelgebruikte overzichten.
  • Gebruik Scheduling voor periodieke of retrybare verwerking.
  • Monitor groeigevoelige tabellen en querypatronen vanaf het begin.

Geen fase-1-uitgangspunt:

- aparte databases per module
- aparte databasegebruikers per module
- RabbitMQ of externe message broker
- microservices
- publieke mobiele API

22.13 Caching en materialisatie

Caching wordt voorzichtig toegepast omdat autorisatie- en contextgrenzen sterk zijn.

CachevormGebruikVoorwaarde
Request-scope cachehergebruik binnen één requestgeen autorisatieverbreding
Memory cachestabiele referentiedata of korte tellerwaardenkorte TTL en contextveilige key
Materialized readmodelzware overzichten/tellersmodule-eigenaarschap en rebuildpad
Browser cache/storagetoegankelijkheidsweergave of UI-voorkeurengeen persoons-, rol- of autorisatiedata
Tijdelijke bestandsopslagPDF/exportoutputbuiten webroot, cleanup en autorisatie bij download

Cachekeys moeten minimaal rekening houden met gebruiker, rolcontext, objectscope en relevante filters wanneer data contextgevoelig is.

De initiële materialisatiekandidaten staan in hoofdstuk 17. Performanceproblemen worden in de eerste baseline eerst opgelost met indexing, queryscoping, cache-inrichting of de daar genoemde materialisaties voordat modulegrenzen worden doorbroken of een nieuw readmodelproject wordt geïntroduceerd.

22.14 Degradatie van UI

De UI mag functies tijdelijk beperken wanneer onderliggende data of services niet beschikbaar zijn.

Voorbeelden:

UI-onderdeelDegradatiegedrag
Frontpageblokblok toont veilige fout/“tijdelijk niet beschikbaar” in plaats van misleidende nulwaarde
Badgebadge kan tijdelijk verborgen of verouderd zijn, maar readstate blijft server-side leidend
Live meekijkenreconnect of veilige beëindiging met melding
PDF-knopuitgeschakeld of foutrespons wanneer exportbron niet beschikbaar is
Beheer-dashboardfailed-job/status toont technische beheerinformatie zonder gevoelige payloads
Geschiedenisfilterongeldige of niet-beschikbare filters leiden tot veilige fout of lege gevalideerde set

22.15 Health checks en monitoringinput

Hoofdstuk 21 beschrijft operatie en monitoring. Voor performance en beschikbaarheid levert hoofdstuk 22 de technische meetobjecten.

Minimaal te monitoren:

OnderdeelSignaal
Webhostrequestduur, foutpercentages, rate limiting hits
Databaseconnectiviteit, queryduur, deadlocks/time-outs, migratiestatus
Identity providerlogin errors, provider latency, provisioning failures
SignalRconnection count, reconnects, disconnects, hub errors
Schedulingpending jobs, failed jobs, retry counts, job latency
PDF-exportrenderduur, foutpercentage, bestandsgrootte, cleanupresultaat
Readmodelsrebuildstatus, stale count, fallback naar bronquery
Securityaccess denied spikes, verdachte patronen, CSRF/rate-limit events

Alle relevante signalen gebruiken correlation-id’s waar zij voortkomen uit een request, command of jobflow.

22.16 Logging bij performance- en fallbackscenario’s

Performance- en fallbacklogging moet analyse mogelijk maken zonder gevoelige data te lekken.

Logvelden:

CorrelationId
UserId indien toegestaan
RoleContext indien relevant
ModuleName
OperationName
ObjectType
ObjectId indien veilig
DurationMs
FallbackType
RetryAttempt
JobId indien relevant
ResultStatus
ErrorCode

Niet loggen:

wachtwoorden
tokens
volledige antwoordpayloads van leerlingen
volledige privéberichtinhoud
volledige PDF-inhoud
gevoelige persoonsgegevens in vrije tekst

22.17 Performance- en fallbacktests

De teststrategie in hoofdstuk 23 moet voor performance en fallback minimaal de volgende testtypen ondersteunen.

TesttypeDoel
Queryperformance-testscontroleren dat veelgebruikte overzichten bounded en geïndexeerd blijven
Loadtestsrepresentatieve leerling-, docent-, ouder- en beheerflows testen
SignalR-reconnecttestsverbinding verbreken en herstel vanuit Practice valideren
PDF-stresstestsgrote resultaten en lange tabellen renderen zonder geheugenproblemen
Job-retrytestsretries, failed-statussen en idempotentie controleren
Readmodel-rebuildtestsmaterialisatie opnieuw opbouwen vanuit brondata
Fallbacktestsfouten in dependencies simuleren en veilige UI-respons valideren
Security-performance testsrate limits, access denied logging en veilige foutrespons testen
Transaction boundary testskritieke workflows zonder halve toestand laten falen

22.18 Implementatiechecklist

Bij implementatie van performance- of fallbackgevoelige functionaliteit moet minimaal worden gecontroleerd:

  • Is de brondata-eigenaar duidelijk?
  • Is de query bounded, gepagineerd of bewust gelimiteerd?
  • Zijn benodigde indexen binnen het module-eigen schema beschreven?
  • Is autorisatie server-side toegepast vóórdat data wordt samengesteld?
  • Is duidelijk of de workflow kritisch, retrybaar of degradeerbaar is?
  • Is fallbackgedrag niet misleidend?
  • Is er een correlation-id in logs en jobs?
  • Is gevoelige data uitgesloten van logs?
  • Is idempotentie geborgd bij retries?
  • Is failed-status beheerbaar wanneer retrylimieten zijn bereikt?
  • Is cachegebruik contextveilig?
  • Is er een test voor fout- of fallbackgedrag?
  • Is documentatie-impact op Technisch Ontwerp, database-informatie, Software Requirements Specification of Functioneel Ontwerp beoordeeld?

22.19 Implementatieverificaties

PuntControle
Concrete NFR-grenswaardenSoftware Requirements Specification en niet-functionele requirementregisters nalopen en meetpunten koppelen aan implementatietests.
LoadtestprofielenRepresentatieve datasets en scenario’s definiëren voor leerling, docent, ouder/voogd en beheerder.
PDF-limietenMaximale renderduur, bestandsgrootte en tijdelijke bewaartermijn vastleggen.
SignalR-capaciteitVerwachte gelijktijdige live-meekijksessies en reconnectgedrag technisch testen.
TickerQ-dashboardInterne beschikbaarheid, autorisatie en monitoring van failed jobs verifiëren.
CachebeleidTTL’s, invalidatie en contextveilige cachekeys per readmodel concretiseren.
Database-indexenPer module querypatronen vertalen naar concrete indexvoorstellen.
FallbacktekstenGebruikersgerichte fout- en tijdelijke-onbeschikbaarteksten koppelen aan popup-/meldingsregisters waar van toepassing.
MonitoringproviderKeuze voor technische monitoring/loggingprovider vastleggen in operatie- of infrastructuurdocumentatie.