Hoe bouw je een examklok waar studenten niet mee kunnen valsspelen?
Share

In this article
Maak de server de enige bron van waarheid voor de deadline. Houd de sessie vast in Redis, schrijf elk antwoord daar direct weg zodra het geselecteerd wordt, flush periodiek naar de database en stuur automatisch in zodra de serverdeadline is verstreken. De klok aan de clientzijde is slechts een weergave, dus het aanpassen van de systeemklok of het minimaliseren van het tabblad verandert niets.
Waarom kan de timer niet in de browser zelf draaien?
Een countdown aan de clientzijde kan worden verlengd door de systeemklok aan te passen, een tabblad op de achtergrond te pauzeren of te knoeien met lokale opslag. Alles wat de client beheert is onbetrouwbaar voor een deadline. De browser kan de resterende tijd tonen, maar de server bepaalt wanneer de poging eindigt.
Waarom de examsessie opslaan in Redis?
Met meer dan 500 studenten die tegelijk een test starten, is een roundtrip naar de primaire database bij elk antwoord te traag. Het direct wegschrijven van elk antwoord in een Redis-sessie is sub-seconde snel. De sessie wordt periodiek naar MongoDB weggeschreven en de server stuurt automatisch in bij de deadline.
Hoe voorkom je dat een antwoord dubbel wordt ingediend vanuit twee tabbladen?
Gebruik een kortdurende Redis-lock op het poging-ID, in SETNX-stijl. De eerste inzending neemt de lock en wint; de tweede wordt afgewezen omdat deze al verwerkt is. Dit is bewust pessimistisch: een inzending gebeurt één keer, dus een lock van enkele milliseconden is goedkoper dan een dubbel getelde poging die de ranglijst corrumpeert.
Hoe bereken je de All-India Rang zonder elke poging opnieuw te scannen?
Zet ingediende pogingen in een RabbitMQ-queue. Een scoring worker verwerkt deze, werkt de score en percentiel cumulatief bij en schrijft de resultaten naar Redis. Ranglijsten en hoofdstukanalyses worden dan uit een snelle cache gelezen in plaats van bij elke resultaatpagina opnieuw te berekenen.
Oorspronkelijk gepubliceerd op sakshamjain.codes/blog/server-authoritative-exam-timer-with-redis. Wil je dit laten bouwen? Bekijk mijn diensten op NexoRush of stuur me een bericht.