我正试图找出一个有效的方法,电影票预订系统。我主要关注的领域是处理一个用户的并发预订,即两个或多个用户试图在给定的时间内预订相同的座位。
许多在线解决方案都建议通过同步来处理并发,即使事务对其他用户可见(类似于java中的同步方法/块)。
我认为,上面的方法可能不是一个可伸缩的解决方案,因为如果请求的数量增加到百万/秒。我们不能指望这些事务一个接一个地线性化。它会造成很大的延迟。
我的方法之一是保持座位的状态,就像
EMPTY
IN_PROGRESS
BOOKED单击“支付”按钮后,状态从“空”更改为“IN_PROGRESS”。因此,其他用户选择相同的座位并单击支付按钮,可以对座位的状态进行检查,如果是IN_PROGRESS,则可以显示合适的消息。
如果已通过付款的用户,如果成功的座位状态更改为预订,如果失败的状态将更改为空。
请告诉我,我的方法是否有任何问题,或是否有任何有效的方法处理并发在座位预订。谢谢
发布于 2022-08-09 10:15:33
我认为您可以在这里使用的最佳方法是创建一个会话,该会话将在应用程序中设置的分钟数之后过期。您希望为用户提供选择可用的座位号的能力。
然后发送一个帖子请求到后端锁定那些座位的时间。如果会话到期,则处理事件并解锁这些座位。否则,等待付款成功。一旦付款被处理,您只需要增加整个筛选时间的锁定窗口。
使用这种方法,您将能够避免多个用户预订同一个座位的问题。
可以使用像{ "locked" : true, "lock_expires": 163457987 }这样的属性。
如果为时已晚,请检查lock_expires属性并设置locked: false并重定向或刷新页面。否则,设置"lock_expires": <time when screening ends>。
可以实现一个cron作业,它每分钟运行一次,以验证所有锁。如果lock_expires没有通过验证,那么locked将自动设置为false。如果用户离开选项卡或关闭浏览器,这将非常有用。
如果有人有更好的解决方案,那么请评论,我会更新它。
https://stackoverflow.com/questions/49137688
复制相似问题