Como construir um temporizador de exame que os alunos não possam trapacear?
Share

In this article
Faça do servidor a fonte de verdade para o prazo. Mantenha a sessão no Redis, escreva cada resposta lá assim que for selecionada, envie para a base de dados periodicamente e envie automaticamente quando o prazo do servidor passar. O relógio do cliente é apenas uma exibição, então alterar o relógio do sistema ou colocar a aba em segundo plano não altera nada.
Por que o temporizador não pode estar no navegador?
Uma contagem regressiva no lado do cliente pode ser estendida ao editar o relógio do sistema, pausar uma aba em segundo plano ou manipular o estado local. Qualquer coisa controlada pelo cliente não pode ser confiável para um prazo. O navegador pode mostrar o tempo restante, mas o servidor deve decidir quando a tentativa termina.
Por que armazenar a sessão do exame no Redis?
Com mais de 500 alunos iniciando uma série de testes no mesmo horário, uma ida ao banco de dados principal a cada resposta é muito lenta. Escrever cada resposta na sessão mantida no Redis assim que selecionada é quase instantâneo. A sessão é enviada para o MongoDB periodicamente, e o servidor envia automaticamente no prazo final.
Como evitar um envio duplo a partir de duas abas?
Coloque um bloqueio temporário no Redis para o ID da tentativa, no estilo SETNX. O primeiro envio obtém o bloqueio e vence; o segundo é rejeitado por já ter sido processado. Isso é pessimista por design: um envio acontece uma vez, então alguns milissegundos de bloqueio são mais baratos do que uma tentativa contada duas vezes corrompendo o ranking.
Como calcular o Ranking Nacional sem reanalisar todas as tentativas?
Coloque as tentativas enviadas em uma fila RabbitMQ. Um trabalhador de pontuação as consome, atualiza a pontuação e o percentil incrementalmente, e grava os resultados no Redis. O ranking e as análises por capítulo são então lidos de um cache rápido, em vez de serem recalculados a cada visualização da página de resultados.
Publicado originalmente em sakshamjain.codes/blog/server-authoritative-exam-timer-with-redis. Precisa disso implementado? Veja meus serviços em NexoRush ou envie uma mensagem.