Wie baut man einen Prüfungs-Timer, den Schüler nicht betrügen können?
Share

In this article
Machen Sie den Server zur einzigen Quelle der Wahrheit für die Frist. Halten Sie die Sitzung in Redis, schreiben Sie jede Antwort dort sofort nach Auswahl, speichern Sie sie periodisch in der Datenbank und senden Sie automatisch ab, wenn die Serverfrist abläuft. Die Client-Uhr ist nur eine Anzeige, daher ändert das Verstellen der Systemuhr oder das Ausblenden des Tabs nichts.
Warum kann der Timer nicht im Browser laufen?
Ein clientseitiger Countdown kann durch Ändern der Systemuhr, Pausieren eines Hintergrund-Tabs oder Manipulation des lokalen Zustands verlängert werden. Alles, was der Client kontrolliert, kann für eine Frist nicht vertrauenswürdig sein. Der Browser kann die verbleibende Zeit anzeigen, aber der Server muss entscheiden, wann der Versuch endet.
Warum die Prüfungssitzung in Redis speichern?
Bei über 500 Schülern, die gleichzeitig eine Testreihe starten, ist eine Datenbankabfrage bei jeder Antwort zu langsam. Das Schreiben jeder Antwort in eine Redis-Sitzung bei Auswahl erfolgt in unter einer Sekunde. Die Sitzung wird periodisch in MongoDB gespeichert, und der Server sendet bei Fristablauf automatisch ab.
Wie verhindert man eine doppelte Abgabe aus zwei Tabs?
Setzen Sie eine kurzlebige Redis-Sperre auf die Versuch-ID, im SETNX-Stil. Die erste Abgabe erhält die Sperre und gewinnt; die zweite wird als bereits verarbeitet abgelehnt. Das ist bewusst pessimistisch: Eine Abgabe soll nur einmal erfolgen, daher ist eine wenige Millisekunden dauernde Sperre günstiger als ein doppelt gezählter Versuch, der das Ranking verfälscht.
Wie berechnet man den All-India-Rang ohne jeden Versuch neu zu scannen?
Stellen Sie eingereichte Versuche in eine RabbitMQ-Warteschlange. Ein Scoring-Worker verarbeitet sie, aktualisiert Punktzahl und Perzentil-Inkremente und schreibt die Ergebnisse in Redis. Rang- und kapitelbezogene Analysen werden dann aus einem schnellen Cache gelesen, statt bei jedem Ergebnis neu berechnet zu werden.
Ursprünglich veröffentlicht unter sakshamjain.codes/blog/server-authoritative-exam-timer-with-redis. Benötigen Sie diese Lösung? Sehen Sie meine Services auf NexoRush oder kontaktieren Sie mich.