作为练习,我正在尝试为多个会议室设计一个简单的日历预订系统。我有点担心一些要求,比如在给定的时间范围内找到可用的房间,查找房间预订情况。然而,我似乎有点停留在预订场景上,比如在特定的比赛情况下,两个用户试图在同一时间预订A房,他们选择的时间范围可能完全相同或重叠。例如,用户1试图从上午10点到下午12点预订A室,用户2试图从上午9点到上午11点预订A室。当查找可用时间时,这个房间出现给两个用户,表示在所要求的时间框架内可用。在这种情况下,由于它们是重叠的,我只能接受一个预订而另一个失败,为了简单起见,我不会给任何用户优先权,而只是先到先得。我如何有效地解决这部分问题?我想用几种方法来处理这个问题:
如果你要设计这样一个系统,你会怎么做呢?不管怎样,我们可以实时确认预订吗?如果预订单位在白天,在假设的情况下,只有一个房间是用户想要预订的,那么在这样的情况下,酒店预订系统将如何工作?
发布于 2019-01-29 12:18:30
队列看起来是解决这个问题的一个很好的解决方案。体面的队列实现确保一个去队列操作只看到一条消息,这样您所描述的条件就不会发生(您没有考虑编写自己的队列,是吗?)请不要这样做)。
发布于 2023-01-30 16:51:21
当您在agoda、预订或任何航班/酒店搜索平台中搜索任何内容时,给出特定的时间范围,然后选择航班/酒店,然后进行结账--您已经在顶部看到了一个计时器。计时器有一个有限的时间,最常见的5或10分钟。你得在那个时段内买东西。
计时器确保了一些事情-
为了实现这样的延迟释放机制(基本上是锁),大多数实现都使用快速查找临时存储,比如redis。您不应该像任何数据库一样在这里使用持久存储。
你应该拥有的是-
如果您有多个redis副本,由于复制滞后,您仍然可以进入一种情况,当两者仍然能够继续直到签出。但是,这也是计时器可能会来拯救的地方;您可以进行连续的轮询,以查看状态是否仍然有效。如果您的查找现在返回,您不能再预订,您显示了相关的经验(即有人已经预订或其他)!
您甚至可以通过执行套接字推送来实现更智能的解决方案。发送拒绝推送如果在您的背景检查中,您看到当前签出开始于X时间,但在X- 0.001时间已经有另一个正在进行的签出,它现在可以在您的红皮书中使用。
我希望这能给你一些关于如何实现它的想法。
发布于 2019-01-28 20:31:22
一种方法是把一天分成15分钟的增量。然后只需按房间、日期和间隔ID创建主键。如果有人试图插入另一条记录,将发生主键错误。对于这种方法,一个人只需要一个表。您不需要事务,因为数据库是原子的,不允许重复主键。
如果您希望能够预订任何时间段,那么就需要一个事务,因为使用键是有问题的。事务将必须查看表中的记录,并查看会议的开始和结束是否与任何其他记录重叠。如果是这样,返回消息说不能预订和结束交易,如果没有预订房间和完成交易。当你寻找,没有其他人可以预订,所以他们必须等到你的交易结束后,他们才能开始他们的。这会导致阻塞。为了减轻..。
在这种情况下,您可能希望每个房间都是自己的表,以便当您的锁定和该房间有事务时,其他预订其他房间的用户不必等到您的预订完成。这使整个房间具有更大的可伸缩性,并且只有当两个用户同时预订房间时才会阻塞(不太可能,但可能)。
https://softwareengineering.stackexchange.com/questions/386233
复制相似问题