Comment créer un minuteur d'examen que les étudiants ne peuvent pas tricher ?
Share

In this article
Faites du serveur la source de vérité pour la date limite. Conservez la session dans Redis, enregistrez chaque réponse dès qu'elle est sélectionnée, videz périodiquement dans la base de données, et soumettez automatiquement lorsque la date limite côté serveur est dépassée. L'horloge du client n'est qu'un affichage, donc modifier l'horloge système ou mettre l'onglet en arrière-plan ne change rien.
Pourquoi le minuteur ne peut-il pas être dans le navigateur ?
Un compte à rebours côté client peut être prolongé en modifiant l'horloge système, en mettant un onglet en pause ou en manipulant l'état local. Tout ce que le client contrôle ne peut pas être fiable pour une date limite. Le navigateur peut afficher le temps restant, mais c'est le serveur qui doit décider quand la tentative se termine.
Pourquoi stocker la session d'examen dans Redis ?
Avec plus de 500 étudiants débutant une série de tests dans le même créneau, un aller-retour vers la base de données principale à chaque réponse est trop lent. Écrire chaque réponse dans une session Redis dès sa sélection est quasi instantané. La session est vidée périodiquement dans MongoDB, et le serveur soumet automatiquement à la date limite.
Comment empêcher une double soumission depuis deux onglets ?
Placez un verrou Redis à courte durée de vie sur l'ID de la tentative, de type SETNX. La première soumission prend le verrou et est acceptée ; la seconde est rejetée comme déjà traitée. C'est une approche pessimiste par conception : une soumission doit se faire une seule fois, donc quelques millisecondes de verrou sont moins coûteuses qu'une tentative comptée deux fois qui fausserait le classement.
Comment calculer le classement national sans rescanner chaque tentative ?
Placez les tentatives soumises dans une file RabbitMQ. Un worker de notation les consomme, met à jour le score et le percentile de manière incrémentale, puis écrit les résultats dans Redis. Le classement et les analyses par chapitre sont alors lus depuis un cache rapide au lieu d'être recalculés à chaque affichage de page de résultats.
Publié à l'origine sur sakshamjain.codes/blog/server-authoritative-exam-timer-with-redis. Besoin de cette solution ? Consultez mes services sur NexoRush ou contactez-moi.