如何设计具有等待功能的酒店预订系统

问题描述 投票:0回答:1

我在面试中遇到了这个系统设计问题,我没有最好的答案。

问题是:我们想为一个用户保留一个房间5分钟,我们该怎么做?

库存数据如下所示:

酒店 ID 房间类型_id 日期 总库存 总保留
123 001 2023-09-30 100 99
123 001 2023-10-01 100 96

流程是,一旦用户进入预订详细信息页面,预订服务首先在缓存中检查库存,然后现在应该有某种锁定机制来锁定房间 5 分钟。 2023年9月30日,仍有一间客房可供预订,用户A可以继续实际预订。如果同时用户 B 尝试做同样的事情,系统会以某种方式知道该特定房间类型在该日期被锁定,并且没有更多房间可供预订,因此系统将显示“此房间是不可用”

我的问题是:

  1. 我应该说我可以使用 Redis 锁管理来完成此操作还是其他操作?
  2. 锁定机制实际上是如何工作的?实际上什么是锁定?即理想情况下我不应该正确锁定整行?因为其他用户应该可以在
    total_inventory - total_reserved > 0
  3. 时预订房间

我提到我们可能应该使用锁来锁定房间并设置 5 分钟的 TTL 来释放锁。但我无法真正一步一步解释清楚它是如何工作的。我的猜测是:

  1. 在 redis 中为每个条目添加一个保留值。例如
    key = 123_001_2023_09_30(hotel_id_room_type_id_date)
    value = { total_inventory: 100, total_reserved: 99, on_hold: 1}
    TTL = 5 mins
  1. 每次有其他用户尝试预订时,应该首先检查是否

    total_reserved + on_hold >= total_inventory
    ,如果为真,则阻止用户继续下一步

  2. 一旦时间到了(5分钟),redis会自动将on_hold减1(但这可行吗??)

我的答案与真实答案相距甚远吗?非常感谢任何帮助

architecture locking system
1个回答
0
投票

诀窍是,每个锁都有不同的 TTL。所以你确实需要一组会过期的锁。您可以通过在 Redis 中存储锁“密钥”来实现这一点,每个锁有 1 个 TTL,然后扫描它们进行计数。这在 Redis 中并不是一个理想的操作。我实际上会考虑某种数据库,它会插入具有明确到期时间的保留行,以便您可以有效地查询它。它将给您带来许多下游优势,例如能够轻松延长保留时间,以及能够执行诸如找出历史上有趣的事情(例如转化率)之类的事情。

© www.soinside.com 2019 - 2024. All rights reserved.