¿Cómo construir un temporizador de examen que los estudiantes no puedan engañar?
Share

In this article
Haz que el servidor sea la fuente de verdad para la fecha límite. Mantén la sesión en Redis, escribe cada respuesta allí en cuanto se seleccione, vacía periódicamente a la base de datos y envía automáticamente cuando pase la fecha límite del servidor. El reloj del cliente es solo una visualización, por lo que cambiar el reloj del sistema o poner la pestaña en segundo plano no cambia nada.
¿Por qué el temporizador no puede estar en el navegador?
Una cuenta regresiva del lado del cliente puede extenderse editando el reloj del sistema, pausando una pestaña en segundo plano o manipulando el estado local. Nada que controle el cliente puede ser confiable para una fecha límite. El navegador puede mostrar el tiempo restante, pero el servidor debe decidir cuándo termina el intento.
¿Por qué almacenar la sesión del examen en Redis?
Con más de 500 estudiantes comenzando una serie de pruebas en el mismo horario, una ida y vuelta a la base de datos principal por cada respuesta es demasiado lenta. Escribir cada respuesta en una sesión mantenida en Redis al seleccionarla es subsegundo. La sesión se vacía periódicamente a MongoDB, y el servidor envía automáticamente al pasar la fecha límite.
¿Cómo evitar un envío doble desde dos pestañas?
Coloca un bloqueo de corta duración en Redis sobre el ID del intento, al estilo SETNX. El primer envío toma el bloqueo y gana; el segundo es rechazado por ya haber sido procesado. Esto es pesimista por diseño: un envío ocurre una vez, por lo que unos pocos milisegundos de bloqueo son más baratos que un intento contado doble que corrompa el ranking.
¿Cómo calcular el ranking a nivel nacional sin volver a escanear cada intento?
Coloca los intentos enviados en una cola RabbitMQ. Un trabajador de puntuación los consume, actualiza la puntuación y el resumen percentil incrementalmente, y escribe los resultados en Redis. El ranking y los análisis por capítulo se leen entonces desde una caché rápida en lugar de recalcularse en cada vista de página de resultados.
Publicado originalmente en sakshamjain.codes/blog/server-authoritative-exam-timer-with-redis. ¿Necesitas esto desarrollado? Consulta mis servicios en NexoRush o envíame un mensaje.