← Všechny práce
OmnibusŽivé demoRezervace míst · týmový projekt na ČVUT FEL

Dva cestující, jedno místo, žádná dvojí rezervace

Rezervační systém autobusů s živou mapou míst. Když dva lidé sáhnou po stejném místě ve stejnou chvíli, dostane ho jen jeden.

Týmový semestrální projekt na ČVUT FEL, autoři Mykhailo Plokhin a Ivan Shestachenko. Je to demo, ne skutečný dopravce.

Otevřít aplikaciZdrojový kódomnibus.79.72.58.230.nip.io

Java · Spring Boot · PostgreSQL · React · Docker · k3s

Úvodní stránka Omnibusu v telefonu: vyhledání spoje a oblíbené trasy z Česka
Omnibus v telefonu: detail cesty na lince 501 z Prahy do Brna

Problém

Rezervační systémy selhávají přesně ve chvíli, kdy dva lidé chtějí totéž ve stejný okamžik — a to je zároveň chvíle, kdy firma vydělává.

  • Když aplikace místo nejdřív přečte a pak zapíše, dva požadavky ho můžou oba vidět volné a oba ho zarezervovat.
  • Přeprodání se často řeší až dodatečně nočním skriptem a omluvou, místo aby bylo vůbec nemožné.
  • Cestující a dispečer potřebují různá práva, ne stejný endpoint za jinou obrazovkou.

Jak je to postavené

Rezervace vlastní jedna služba a nic jiného místa nezapisuje. Sporné místo projde jednou krátkou transakcí, která drží zámek řádku.

Plánek míst Omnibusu v telefonu: volná, obsazená a panoramatická místa po řadách
ABčekáobsazeno

Cestující A rezervuje místo 12. Databáze ten řádek zamkne.

Cestující B ve stejnou chvíli chce místo 12 a čeká, až se zámek uvolní.

Rezervace A se uloží. B dostane „místo obsazeno“, ne dvojí rezervaci.

tokenrezervaceFOR UPDATEIngressSpring REST APIRole · JWTRezervační službaTrasy a vozový parkPostgreSQL · zámky

Klíčová rozhodnutí

Každé rozhodnutí a alternativa, kterou porazilo.

Zamknout řádek sporného místa

Druhý požadavek počká, místo aby přepsal, a čeká krátce, protože držení místa je v transakci jediná práce. Alternativou byly optimistické opakované pokusy; na plném spoji se z nich stane lavina.

Jedna cesta zápisu pro rezervace

Jízdní řád, mapa míst i dispečer jen čtou. S jediným zapisovatelem je pravidlo „jedno místo, jeden cestující“ něco, co systém umí skutečně ověřit.

Role ověřené na endpointu

Spring Security určí roli dřív, než se spustí handler, takže akce dispečera není dostupná z URL cestujícího.

Čísla

Omnibus je univerzitní projekt se živým demem, ne komerční služba. Ověřené údaje jsou zkontrolované v kódu; cíl je to, na co je navržen.

ÚdajCo znamená
ZeroDvojí rezervaceCíl návrhu: druhý zápis odmítne databáze, ne noční skript dodatečně.Cíl
FOR UPDATEZámek místaPesimistický zámek řádku v dotazu na místo (BookedSegmentRepository).Ověřeno
k3sBěží naKontejnery na clusteru k3s — adresa v odkazu na této stránce.Ověřeno
Cíl
— Na co je systém navržen — ne naměřený výsledek
Ověřeno
— Ověřeno v kódu nebo na běžící verzi

Potřebujete něco podobného?

Popište zadání pár řádky. Odpoví člověk z týmu.

Probrat projekt