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.
Java · Spring Boot · PostgreSQL · React · Docker · k3s


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.

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.
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.
| Údaj | Co znamená | Základ |
|---|---|---|
| ZeroDvojí rezervace | Cíl návrhu: druhý zápis odmítne databáze, ne noční skript dodatečně.Cíl | Cíl |
| FOR UPDATEZámek místa | Pesimistický zámek řádku v dotazu na místo (BookedSegmentRepository).Ověřeno | Ověřeno |
| k3sBěží na | Kontejnery na clusteru k3s — adresa v odkazu na této stránce.Ověřeno | 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

