Come costruire un timer per esami che gli studenti non possono barare?
Share

In this article
Rendi il server la fonte di verità per la scadenza. Mantieni la sessione in Redis, scrivi ogni risposta lì non appena viene selezionata, salva periodicamente sul database e invia automaticamente quando scade il tempo stabilito dal server. L'orologio del client è solo un display, quindi modificare l'orologio di sistema o mettere in background la scheda non cambia nulla.
Perché il timer non può vivere nel browser?
Un conto alla rovescia lato client può essere esteso modificando l'orologio di sistema, mettendo in pausa una scheda in background o manomettendo lo stato locale. Qualsiasi cosa controllata dal client non può essere considerata affidabile per una scadenza. Il browser può mostrare il tempo rimanente, ma è il server a decidere quando termina il tentativo.
Perché memorizzare la sessione d'esame in Redis?
Con oltre 500 studenti che iniziano una serie di test nello stesso intervallo, una chiamata al database principale per ogni risposta è troppo lenta. Scrivere ogni risposta in una sessione mantenuta in Redis al momento della selezione è sotto il secondo. La sessione viene salvata periodicamente su MongoDB e il server invia automaticamente alla scadenza.
Come si evita un doppio invio da due schede?
Metti un blocco Redis a breve durata sull'ID del tentativo, in stile SETNX. Il primo invio prende il blocco e vince; il secondo viene rifiutato come già processato. Questo è pessimista per design: un invio avviene una sola volta, quindi pochi millisecondi di blocco costano meno di un tentativo conteggiato due volte che corrompe la classifica.
Come si calcola il Rank All-India senza riesaminare ogni tentativo?
Metti i tentativi inviati in una coda RabbitMQ. Un worker di scoring li consuma, aggiorna punteggio e percentile in modo incrementale e scrive i risultati in Redis. La classifica e le analisi per capitolo vengono quindi lette da una cache veloce invece di essere ricalcolate a ogni visualizzazione della pagina dei risultati.
Originariamente pubblicato su sakshamjain.codes/blog/server-authoritative-exam-timer-with-redis. Hai bisogno di questo sistema? Guarda i miei servizi su NexoRush o contattami.