Jak zbudować timer egzaminacyjny, którego uczniowie nie mogą oszukać?
Share

In this article
Uczyń serwer źródłem prawdy dla terminu. Przechowuj sesję w Redis, zapisuj każdą odpowiedź w momencie jej wyboru, okresowo zapisuj do bazy danych i automatycznie zatwierdzaj po upływie terminu na serwerze. Zegar klienta jest tylko wyświetlaczem, więc zmiana czasu systemowego lub przejście na inny panel nic nie zmienia.
Dlaczego timer nie może działać w przeglądarce?
Odliczanie po stronie klienta można wydłużyć przez zmianę czasu systemowego, wstrzymanie działania zakładki w tle lub manipulację lokalnym stanem. Nic, co kontroluje klient, nie może być zaufane w kwestii terminu. Przeglądarka może wyświetlać pozostały czas, ale to serwer decyduje, kiedy próba się kończy.
Dlaczego sesja egzaminacyjna jest przechowywana w Redis?
Przy ponad 500 uczniach rozpoczynających test w tym samym czasie, każde zapytanie do głównej bazy danych przy każdej odpowiedzi byłoby zbyt wolne. Zapis każdej odpowiedzi do sesji w Redis w momencie wyboru trwa poniżej sekundy. Sesja jest okresowo zapisywana do MongoDB, a serwer automatycznie zatwierdza odpowiedzi po upływie terminu.
Jak zapobiec podwójnemu zatwierdzeniu z dwóch zakładek?
Użyj krótkotrwałej blokady Redis na ID próby, w stylu SETNX. Pierwsze zatwierdzenie zdobywa blokadę i jest akceptowane; drugie jest odrzucane jako już przetworzone. To podejście pesymistyczne: zatwierdzenie następuje raz, więc kilka milisekund blokady jest tańsze niż podwójne liczenie próby, które zafałszowałoby ranking.
Jak obliczyć ogólnokrajowy ranking bez ponownego skanowania każdej próby?
Umieść zatwierdzone próby w kolejce RabbitMQ. Proces oceniający je konsumuje, aktualizuje wynik i procentylowy zbiorczy wynik inkrementalnie, a wyniki zapisuje do Redis. Ranking i analizy według rozdziałów są wtedy odczytywane z szybkiego cache, zamiast być przeliczane przy każdym wyświetleniu strony z wynikami.
Artykuł pierwotnie opublikowany na sakshamjain.codes/blog/server-authoritative-exam-timer-with-redis. Potrzebujesz takiego rozwiązania? Zobacz moje usługi na NexoRush lub napisz do mnie.