Làm thế nào để một hệ thống đặt chỗ ngồi rạp chiếu phim ngăn không cho nhiều người dùng đặt cùng một chỗ?


34

Trong rạp chiếu phim tôi đi đến họ có các quầy bán vé cho phép bạn chọn chỗ ngồi bạn muốn; họ cũng có một trang web hoạt động tương tự (trang web này cũng có đồng hồ đếm ngược khoảng 30 giây trong đó bạn phải chọn chỗ ngồi).

Mặc dù tôi hiểu những thứ như giao dịch cơ sở dữ liệu và các kỹ thuật khác để xử lý nhiều người dùng đồng thời, tôi chỉ không thể hiểu được cách nhiều người có thể được phép chọn một chỗ ngồi cùng một lúc; Là đơn giản như người đầu tiên nhấn MUA ghế và người khác sẽ nhận được thông báo lỗi, hoặc tôi đang thiếu một cái gì đó?


10
"Có đơn giản như lần đầu tiên nhấn MUA được chỗ ngồi và người khác sẽ nhận được thông báo lỗi". Cái đó.
yannis

2
Vâng có lẽ, vào một ngày bận rộn với hàng tá máy móc có vẻ như đó sẽ là một nỗi đau.
mbwasi

2
Có lẽ, nhưng hãy nhớ rằng người dùng sẽ dành phần lớn thời gian của họ cho các màn hình khác (nhập chi tiết thanh toán, chờ vé để in, v.v.), vì vậy tất cả họ sẽ không chọn chỗ cùng một lúc, và không tất cả mọi người đều có cùng sở thích chỗ ngồi, vì vậy ngay cả những người đang chọn cùng một lúc cũng có thể chọn những chỗ ngồi khác nhau. Tôi không mong đợi sẽ có nhiều va chạm như vậy.
Dave Sherohman

2
@JimG. Đối với mọi giải pháp có thể, nếu cả hai khách hàng nhấn mua cùng một lúc (đến mili giây), một người sẽ được phục vụ và người kia sẽ nhận được một số thông báo lỗi. Có nhiều cách hay để giảm thiểu khả năng xảy ra (về mặt kỹ thuật và khái niệm, như được giải thích trong các câu trả lời) nhưng trong tình huống bất thường xảy ra thì một yêu cầu sẽ được phục vụ và yêu cầu khác sẽ thất bại. Đơn giản vậy thôi.
yannis

3
@JimG. Đó không phải là một loại hành vi. Đồng thời hoạt động đến một điểm, nếu cả hai yêu cầu đạt được cùng một microtime, một yêu cầu sẽ thất bại. Tất nhiên bạn có thể xây dựng một thông báo lỗi tốt xung quanh đó, như trong nhận xét của Hand-E-Food, nhưng thực tế vẫn còn: Nó đơn giản như phục vụ một yêu cầu và thất bại yêu cầu khác. Tôi không nói rằng bạn không nên làm mọi thứ để đảm bảo rằng thất bại là thân thiện với người dùng nhất có thể hoặc bạn không nên bảo vệ xung quanh nó.
yannis

Câu trả lời:


27

Phương pháp cổ điển để thực hiện việc này là sử dụng cơ sở dữ liệu giao dịch (vì vậy không có xung đột) và phân bổ chỗ ngồi dự kiến cho bạn hết hạn sau một khoảng thời gian (ví dụ: 10 phút cho các ki-ốt) cho bạn đủ thời gian để trả. Nếu giao dịch (khách hàng nhìn thấy) rơi vào hoặc hết thời gian, việc phân bổ chỗ ngồi có thể được giải phóng trở lại vào nhóm. (Tất cả các thay đổi trạng thái được xử lý thông qua cơ sở dữ liệu giao dịch và một giao dịch có thể nhìn thấy của khách hàng có thể yêu cầu nhiều giao dịch cấp cơ sở dữ liệu.)

Các hãng hàng không sẽ sử dụng một hệ thống tương tự (mặc dù phức tạp hơn nhiều do phải xử lý nhiều chặng bay!) Để đặt chỗ trực tuyến. Tôi sẽ tưởng tượng rằng thời gian chờ sẽ lâu hơn đáng kể; vé máy bay thường được đặt trước hơn so với vé xem phim, và cũng đắt hơn.


Nhắc bạn, rạp chiếu phim địa phương của tôi không thực sự phân bổ chỗ ngồi bình thường. Thay vào đó, họ cung cấp quá nhiều chỗ ngồi để mọi người có thể bật lên với sự ồn ào tối thiểu. Đó là một kỹ thuật khác nhau, nhưng không liên quan đến câu hỏi của bạn!
Donal Fellows

Tương tự như chọn ghế cho các sự kiện thể thao. Bạn nhận được số ghế N của mình trong 3 phút trong khi bạn quyết định xem bạn có thực sự muốn chúng hay không và hoàn tất thanh toán.
AndyMcKenna

Lưu ý rằng có hai quy trình khác nhau, ví dụ, mua ghế của hãng hàng không: đầu tiên, bạn mua vé mà không có ghế được phân bổ. Thứ hai, khi bạn nhận được thẻ lên máy bay (hoặc nếu bạn đăng ký trực tuyến) thì bạn sẽ có chỗ ngồi. Số lượng vé thực sự quá bán vì họ biết rằng, trung bình, một số lượng nhất định không hiển thị cho chuyến bay. Tuy nhiên, việc phân bổ chỗ ngồi dường như hoạt động bằng cách chỉ định ngẫu nhiên cho bạn một chỗ ngồi (lần đầu tiên đến trước phục vụ) khi bạn đăng ký và sau đó cho phép bạn thay đổi chỗ ngồi bằng cách chọn một chỗ có sẵn, sau đó thực hiện chuyển khoản trong một giao dịch .
Scott Whitlock

2
@DonalFellows bạn có thể giải thích phần phân bổ dự kiến ​​hơn một chút không? Bạn có nghĩa là đặt một số chỗ ngồi cho người dùng trong một khoảng thời gian? Tôi vẫn đang cố gắng để có được một loạt các thách thức phải đối mặt trong loại hệ thống này.
Sandeepan Nath

1
@SandeepanNath Không đúng trong một bình luận, nhưng nguyên tắc là tầm thường. Chỗ ngồi được đặt vào trạng thái được phân bổ tạm thời của người Viking và thời gian chờ của trạng thái đó được ghi nhận cùng một lúc. Nếu đặt phòng được hoàn thành, chỗ ngồi sẽ được phân bổ đầy đủ. Nếu không và thời gian chờ đã đạt được, chỗ ngồi (cuối cùng) được di chuyển trở lại vào bể chính. (Ngoài ra, nếu người dùng hủy bỏ rõ ràng thì ghế sẽ được chuyển thẳng trở lại vào hồ bơi. Không cần phải chờ đợi.)
Donal Fellows

4

30 giây bạn đã thấy ngày nay thường giống như 15 phút. Tôi không tin có một giao dịch cơ sở dữ liệu hoạt động trong thời gian đó.

Nếu tôi thiết kế một hệ thống như vậy, đây là cách tôi sẽ làm: Có các đối tượng kinh doanh BookingReservation. Đặt phòng về cơ bản được xác nhận (tức là trả tiền). Tôi sẽ lưu trữ chúng trong cùng một bảng DB và phân biệt bằng một hoặc hai thuộc tính.

Khi tìm nạp chỗ ngồi có sẵn, bạn sẽ truy vấn cả đặt chỗ và đặt chỗ.

Khi ai đó chọn chỗ ngồi, bạn tạo một đặt chỗ mới, do đó hiển thị cho các khách hàng khác chỗ ngồi như đã lấy. Việc đặt chỗ thứ hai cho cùng một chỗ sẽ bị từ chối - cập nhật hoặc chèn DB sẽ thất bại. Nếu khách hàng xác nhận / trả tiền cho đặt phòng, bạn chuyển nó sang đặt chỗ. Trong một công việc hàng loạt định kỳ, bạn xóa tất cả các đặt phòng cũ hơn 15 phút (hoặc bất cứ lúc nào bạn cung cấp cho khách hàng của mình).



1

Có ít nhất 2 quy trình kinh doanh liên quan ở đây.

  • Quy trình một:

Hiển thị chỗ ngồi có sẵn.

  • Quy trình hai:

Đặt chỗ đã chọn.

Vì các quy trình này không theo dõi nhau một cách miễn dịch và vì 2 người có thể chọn cùng một chỗ nên vấn đề đồng thời phát sinh.

Nếu thiết kế cơ sở dữ liệu của bạn gán các ràng buộc duy nhất chính xác để kết hợp:

-TheaterID

-SeatID

-EventID

là duy nhất, sau đó cơ sở dữ liệu sẽ ngăn ngừa trùng lặp.

Kịch bản sau đây cũng có thể nhưng sẽ được giải quyết bằng cách thực hiện được đề xuất ở trên:

Giả sử chế độ xem lưới khả dụng cho một nhà hát nhất định và một sự kiện nhất định có thể được hiển thị:

  1. User1 hiển thị chỗ ngồi có sẵn (và có chỗ ngồi 1 và 2)
  2. User2 hiển thị chỗ ngồi có sẵn (và có chỗ ngồi 1 và 2)
  3. User1 nói chuyện một chút với khách hàng trên điện thoại
  4. User2 đi và đặt chỗ 2 cho khách hàng của mình
  5. User1 cố gắng đặt ghế 2 cho khách hàng của mình (vì nó hiển thị như có sẵn trên màn hình của anh ta)
  6. Chỉ mục duy nhất ngăn bước 5 đi lại dữ liệu.

Vì vậy, tất cả những gì bạn cần làm có thể không có gì chính xác hơn là thiết kế cơ sở dữ liệu và lựa chọn đúng đắn về các ràng buộc.

Các cách tiếp cận phức tạp khác là có thể nếu bạn muốn, sử dụng hàng đợi giao dịch. Trong trường hợp này, các yêu cầu được ghi trước vào hàng đợi sau đó thực hiện quy trình cứ sau n giây nhưng điều đó hầu như không cần thiết hoặc thực tế trong trường hợp của bạn.

Phần thực sự thú vị là lưới danh sách cho người dùng 1 hiển thị những gì?


1

Bạn có thể tránh điều kiện cuộc đua nếu bạn trì hoãn phân bổ chỗ ngồi cụ thể.

  1. Thu thập tùy chọn chỗ ngồi từ khách hàng (số chỗ ngồi, giá cả, diện tích nhà hát, chỗ ngồi liền kề bắt buộc, v.v ...)
  2. Lưu các tùy chọn chỗ ngồi được yêu cầu trong hàng đợi
  3. Yêu cầu chỗ ngồi từng người một được kéo từ hàng đợi, chỗ ngồi được phân bổ theo sở thích và hoàn thành đặt phòng nếu tìm thấy chỗ ngồi.
  4. Nếu đặt phòng hoàn tất, thông báo cho khách hàng và gửi thư vé; mặt khác, thông báo cho khách hàng rằng không có vé phù hợp với sở thích.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.