Cum construiești un cronometru pentru examen pe care studenții să nu-l poată trișa?
Share

In this article
Fă ca serverul să fie sursa adevărului pentru termenul limită. Păstrează sesiunea în Redis, scrie fiecare răspuns acolo imediat ce este selectat, salvează periodic în baza de date și trimite automat când termenul serverului expiră. Ceasul clientului este doar pentru afișare, deci schimbarea ceasului sistemului sau punerea filei în fundal nu schimbă nimic.
De ce nu poate cronometrul să fie în browser?
Un cronometru pe partea clientului poate fi prelungit prin modificarea ceasului sistemului, punerea filei în fundal sau manipularea stării locale. Nimic ce controlează clientul nu poate fi de încredere pentru un termen limită. Browserul poate afișa timpul rămas, dar serverul trebuie să decidă când se încheie încercarea.
De ce să stochezi sesiunea examenului în Redis?
Cu peste 500 de studenți care încep o serie de teste în același interval, o interogare către baza de date principală pentru fiecare răspuns este prea lentă. Scrierea fiecărui răspuns într-o sesiune ținută în Redis imediat ce este selectat durează sub o secundă. Sesiunea este salvată periodic în MongoDB, iar serverul trimite automat la termen.
Cum oprești trimiterea dublă din două file?
Pune un blocaj Redis cu durată scurtă pe ID-ul încercării, în stil SETNX. Prima trimitere ia blocajul și câștigă; a doua este respinsă ca deja procesată. Aceasta este o abordare pesimistă prin design: o trimitere se face o singură dată, deci câteva milisecunde de blocaj sunt mai ieftine decât o încercare dublă care corupe clasamentul.
Cum calculezi Clasamentul la nivel național fără a re-scana fiecare încercare?
Pune încercările trimise într-o coadă RabbitMQ. Un worker de scor le consumă, actualizează incremental scorul și procentila cumulativă și scrie rezultatele în Redis. Clasamentul și analizele pe capitole sunt apoi citite dintr-un cache rapid, în loc să fie recalculat la fiecare vizualizare a paginii de rezultate.
Publicat inițial la sakshamjain.codes/blog/server-authoritative-exam-timer-with-redis. Ai nevoie să fie construit? Vezi serviciile mele pe NexoRush sau trimite-mi un mesaj.