Order pizza, khi có hai người order cùng lúc chiếc bánh pizza cuối cùng tại cửa hàng.
Mọi người giúp mình tìm giải pháp cho vấn đề này ạ. Một cửa hàng có 10 cái bánh pizza, được bán online, bán hết 9 cái chỉ còn một cái duy nhất. ( cái bánh cuối cùng ) . Trong trường hợp có 2 khách hàng cùng lúc order cái bánh cuối cùng này. Giúp mình tìm tất cả các giải pháp khi gặp phải trường hợp này ạ.
5 ANSWERS
Bài toán này thực sự là một bài toán rất hay. Mình thì không có biết về cái này nhưng mình có 1 số thông tin có vẻ sẽ hữu ích với bạn.
"Làm thế nào để bán chính xác chỉ 10 máy Mac giá chỉ 1/3 giá thị trường cho 50k người đang chờ đặt đồng thời. Đó là một challenge lớn với các hệ thống Ecom. Trong dịp sinh nhật TIKI vừa rồi có hàng trăm mặt hàng giảm giá shock tới hàng chục %, nhiều mặt hàng giảm tới từ 1tr xuống còn gần như cho không 9000 đ. Deal Service là một service mà các engineers TIKI build chỉ trong 2 tuần để đảm bảo consistency dữ liệu. Vừa giải quyết vấn đề performance, vừa đảm bảo chính xác dữ liệu. Nhờ deal service, bộ phận marketing có thể tự tin chạy các chiến dịch marketing lớn mà không lo sợ về độ ổn định của hệ thống. Deal service được based trên một framework mã nguồn mở Gidgo dùng để build các ứng dụng distributed system, high concurrency. Gridgo có được sự đóng góp của nhiều contributor TIKI. https://github.com/gridgo/gridgo "
Nguồn: https://www.facebook.com/NghiaLeMinh/posts/10212920722603818
haha, mình muốn tìm áp dụng thực tế luôn.
@Gin Hai người đến mua bánh là người Việt Nam bạn nhỉ?
@dao.thai.son order online á, khi bị trùng hợp thì mình sẽ giải quyết như thế nào?
@Gin câu hỏi trên của bạn đang là thực tế ak? vậy ai đặt trước thì giao cho người đó và nói khéo để từ chối người còn lại!
@Gin Chả có ý thức gì cả! Bạn cho họ xếp hàng lần lượt vào order, thế là hem có bị trùng nữa
@le.van.giang Giang, thông qua mạng, vậy hệ thống sẽ xử lý như thế nào á. đặt tình huống ra để tìm ra giải pháp, mà có thể làm hài lòng hai người, tại vì đây mình nói 2 người nhưg trên thực tế có thể có nhiều người order cug một lúc
@dao.thai.son online k xếp hàng được
@Gin Có ý thức là xếp hàng được hết à!
@dao.thai.son không nói tới hệ thống vận hành như thế nào á.
@Gin Thế phải nói tới phần nào?
Thực ra bài này cách giải không khó, khó là ở chỗ như Tiki có 50k người cùng đặt 1 lúc. Lúc này Service đặt hàng cần phải call rất nhiều Service khác ví dụ Inventory để check hàng còn hay không với thời gian đảm bảo siêu nhanh dưới 100ms, sau đó Inventory lại phải báo cho các Service khác là hàng đã hết bla bla. Với hệ thống lớn, người ta hay sử dụng Eventually Consistency để giảm độ trễ, tuy nhiên bài của bạn chỉ có 2 người, thì cứ dùng Strong Consistency là được.
bạn có thể tra việc xử lý đồng bộ hóa request, xem họ xử lý nhiều luồng cùng request tới 1 tài nguyên xử lý thế nào
Đáp án ở phía trên của a Quang Phạm dùng giải quyết cho bài toán lớn, khi bạn sử dụng database replica (kiểu dữ liệu phân tán). (Cái này mình cũng chưa đọc ko biết tính khả thi và xử lý bên trong ntn)
Thực ra với bài toán của bạn mình nghĩ nếu bạn chỉ sử dụng với duy nhất 1 database thì đơn giản là ai bấm finish đặt trước thì người đó được cái bánh cuối cùng đó.
Người kia bấm sau khi ko còn dữ liệu trong database thì sẽ trả ra not found và bạn sẽ handle lỗi này. (Các hệ thống đặt hàng bây h cũng làm như vậy, tất nhiên phải ưu tiên ng đến trước rồi)
Đơn giản chỉ thế thôi, cái này cũng giống với trường hợp khi bạn bật 2 màn hình mà cùng xóa 1 item vậy, ai bấm xóa trước thì người còn lại sẽ bị lỗi ) Goodluck
Bạn không hiểu ý rồi, tác giả bài post có đề cập là "cùng lúc order", tức nó là bài toán concurrency, trong rails với thư viện activerecord thì có cơ chế locking để sử lý những trường hợp như vậy.