W jaki sposób system rezerwacji miejsc w kinie uniemożliwia wielu użytkownikom rezerwowanie tych samych miejsc?


34

W kinie chodzę do nich, mają kioski z biletami, które pozwalają wybrać miejsca, które chcesz; Mają też stronę internetową, która robi to samo (strona internetowa ma również odliczanie czasu wynoszące około 30 sekund, w którym musisz wybrać miejsce).

Chociaż rozumiem takie rzeczy, jak transakcje w bazie danych i inne techniki obsługi wielu jednoczesnych użytkowników, po prostu nie mogę się zastanowić, jak wiele osób może wybrać miejsce jednocześnie; czy to tak proste, jak naciśnięcie pierwszego przycisku KUP dostaje miejsca, a druga osoba otrzyma komunikat o błędzie, czy coś mi brakuje?


10
„czy to tak proste, jak naciśnięcie przycisku KUP pierwsze miejsca, a druga osoba otrzyma komunikat o błędzie”. Że.
yannis

2
Tak, pewnie, w zatłoczony dzień z kilkoma maszynami wydaje się, że to byłby ból.
mbwasi

2
Być może, ale pamiętaj, że użytkownicy będą spędzać większość czasu na innych ekranach (wprowadzanie szczegółów płatności, czekanie na wydrukowanie biletów itp.), Więc nie wszyscy będą wybierać miejsca w tym samym czasie, a nie wszyscy mają takie same preferencje dotyczące miejsc, więc nawet ci, którzy wybierają w tym samym czasie, prawdopodobnie wybiorą różne miejsca. Nie spodziewałbym się, że będzie tyle kolizji.
Dave Sherohman,

2
@JimG. Dla każdego możliwego rozwiązania, jeśli obaj klienci będą naciskać kup w tym samym czasie (do milisekundy), jeden zostanie obsłużony, a drugi otrzyma komunikat o błędzie. Istnieją piękne sposoby na zminimalizowanie szansy na takie zdarzenie (techniczne i koncepcyjne, jak wyjaśniono w odpowiedziach), ale w wyjątkowej sytuacji zdarza się, że jedno żądanie zostanie zrealizowane, a drugie zakończy się niepowodzeniem. Tak proste jak to.
yannis

3
@JimG. To nie jest rodzaj zachowania. Współbieżność działa do tego stopnia, że ​​jeśli oba żądania osiągną dokładnie ten sam mikrotim, jedno zakończy się niepowodzeniem. Możesz oczywiście zbudować wokół tego ładny komunikat o błędzie, jak w komentarzu Hand-E-Food, ale fakt pozostaje taki: wystarczy, że obsłużysz jedno żądanie, a drugie nie. Nie mówię, że nie powinieneś robić wszystkiego, aby upewnić się, że upadek jest tak przyjazny dla użytkownika, jak to tylko możliwe, lub że nie powinieneś się wokół tego zabezpieczyć.
yannis

Odpowiedzi:


27

Klasyczną metodą jest skorzystanie z transakcyjnej bazy danych (aby uniknąć kolizji) i dokonanie wstępnej alokacji miejsca, która wygasa po pewnym czasie (np. 10 minut w przypadku kiosków), co daje wystarczająco dużo czasu na zapłacić. Jeśli transakcja (widoczna dla klienta) upadnie lub upłynie limit czasu, przydział miejsc może zostać zwolniony z powrotem do puli. (Wszystkie zmiany stanu są przetwarzane za pośrednictwem transakcyjnej bazy danych, a jedna transakcja widoczna dla klienta może wymagać wielu transakcji na poziomie bazy danych).

Linie lotnicze będą korzystać z podobnego systemu (choć o wiele bardziej złożonego ze względu na konieczność obsługi wielu etapów lotu!) Do rezerwacji miejsc online. Wyobrażam sobie, że limit czasu byłby znacznie dłuższy; bilety lotnicze są zwykle rezerwowane z wyprzedzeniem niż bilety do kina i są również droższe.


Pamiętaj, że moje lokalne kino nie przyznaje normalnie miejsc. Zamiast tego przepełnili miejsca, aby ludzie mogli po prostu pojawić się przy minimalnym zamieszaniu. To inna technika, ale nie pasująca do twojego pytania!
Donal Fellows

Podobne do wybierania miejsc na imprezy sportowe. Otrzymujesz N liczby miejsc zarezerwowanych na 3 minuty, podczas gdy Ty decydujesz, czy naprawdę chcesz je zrealizować, i dokonujesz płatności.
AndyMcKenna

Pamiętaj, że istnieją dwa różne procesy, na przykład przy zakupie biletów lotniczych: po pierwsze, kupujesz bilet bez przydzielonego miejsca. Po drugie, kiedy dostaniesz kartę pokładową (lub odprawisz się online), otrzymasz miejsce. Liczba biletów jest w rzeczywistości wyprzedana, ponieważ wiedzą, że pewna liczba nie pojawia się średnio na lot. Wydaje się jednak, że przydział miejsc działa, losowo przypisując ci miejsce (kto pierwszy, ten lepszy) podczas odprawy, a następnie umożliwiając zmianę miejsca przez wybranie wolnego miejsca, a następnie wykonanie przelewu w ramach jednej transakcji .
Scott Whitlock,

2
@DonalFellows, czy mógłbyś wyjaśnić wstępną część alokacji? Masz na myśli rezerwację niektórych miejsc dla użytkownika na pewien okres czasu? Wciąż próbuję zmierzyć się z wyzwaniami, przed którymi stoi ten system.
Sandeepan Nath,

1
@ SandeepanNath Niepoprawnie w komentarzu, ale zasada jest trywialna. Siedzenie jest wprowadzane w stan „wstępnie przydzielony”, a limit czasu tego stanu jest odnotowywany w tym samym czasie. Po zakończeniu rezerwacji miejsce zostanie w pełni przydzielone. Jeśli nie, a limit czasu zostanie osiągnięty, siedzenie zostanie (ostatecznie) przeniesione z powrotem do głównej puli. (Ponadto, jeśli użytkownik wyraźnie anuluje, wówczas miejsce zostanie przeniesione bezpośrednio z powrotem do puli. Nie trzeba czekać.)
Donal Fellows

4

30 sekund, które widziałeś, obecnie są często bardziej jak 15 minut. Nie sądzę, aby w tym czasie była aktywna transakcja bazy danych.

Gdybym miał zaprojektować taki system, zrobiłbym to w ten sposób: mieć obiekty biznesowe Bookingi Reservation. Rezerwacje są zasadniczo potwierdzonymi (tj. Płatnymi) rezerwacjami. Chciałbym przechowywać je w tej samej tabeli DB i rozróżniać według atrybutu lub dwóch.

Podczas pobierania dostępnych miejsc można wyszukiwać zarówno rezerwacje, jak i rezerwacje.

Gdy ktoś wybierze miejsce, tworzysz nową rezerwację, pokazując tym samym innym klientom miejsce zajęte. Druga rezerwacja dla tego samego miejsca zostanie odrzucona - aktualizacja DB lub wstawienie zakończy się niepowodzeniem. Jeśli klient potwierdzi / zapłaci za rezerwację, przejdziesz na rezerwację. W okresowym zadaniu wsadowym usuwasz wszystkie rezerwacje starsze niż 15 minut (lub o dowolnej godzinie, którą podajesz swoim klientom).



1

W grę wchodzą co najmniej 2 procesy biznesowe.

  • Proces pierwszy:

Pokaż dostępne miejsca.

  • Proces drugi:

Zarezerwuj wybrane miejsce.

Ponieważ procesy te nie następują po sobie nadmiernie, a ponieważ 2 osoby mogą wybrać to samo miejsce, pojawia się problem współbieżności.

Jeśli projekt bazy danych przypisuje poprawne ograniczenie unikatowości, aby kombinacja:

-TheaterID

-SeatID

-EventID

są unikalne, baza danych zapobiegnie duplikowaniu.

Możliwy jest również następujący scenariusz, który zostanie rozwiązany przez powyższą sugerowaną implementację:

Zakładając widok siatki dostępnej dla danego teatru i danego zdarzenia można wyświetlić:

  1. Użytkownik 1 wyświetla dostępne miejsca (i otrzymuje miejsca 1 i 2)
  2. Użytkownik2 wyświetla dostępne miejsca (i otrzymuje miejsca 1 i 2)
  3. Użytkownik 1 rozmawia trochę z klientem przez telefon
  4. Użytkownik2 idzie i rezerwuje miejsce 2 dla swojego klienta
  5. Użytkownik 1 próbuje zarezerwować miejsce 2 dla swojego klienta (ponieważ pokazuje to jako dostępne na ekranie)
  6. Unikalny indeks uniemożliwia przejście do kroku 5 danych.

Tak więc wszystko, co musisz zrobić, to nic więcej jak poprawny projekt bazy danych i właściwy wybór ograniczeń.

W razie potrzeby możliwe są inne, bardziej złożone podejścia, przy użyciu kolejek transakcji. W takim przypadku żądania są zapisywane najpierw w kolejce, a następnie uruchamiane co n sekund, ale nie jest to konieczne ani praktyczne w twoim przypadku.

Naprawdę interesującą częścią jest to, co powinna pokazywać siatka listy dla użytkownika 1?


1

Możesz uniknąć warunków wyścigu, jeśli opóźnisz przydzielenie określonych miejsc.

  1. Zbierz preferencje dotyczące miejsc od klienta (liczba miejsc, cena, powierzchnia teatru, obowiązkowe miejsca obok, itp.)
  2. Zapisz żądane preferencje dotyczące miejsc w kolejce
  3. Żądania miejsc siedzących jeden po drugim są usuwane z kolejki, miejsca przydzielane zgodnie z preferencjami, a rezerwacja kończy się, jeśli miejsca zostaną znalezione.
  4. Po zakończeniu rezerwacji powiadom klientów i bilety pocztowe; w przeciwnym razie powiadom klienta, że ​​żadne bilety nie odpowiadają preferencjom.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.