跳到主要内容

设计 Airbnb 或酒店预订系统

需求

  • 对于客人
    • 按位置、日期、房间数量和客人数量搜索房间
    • 获取房间详情(如图片、名称、评论、地址等)和价格
    • 按日期和房间 ID 从库存中支付并预订房间
      • 作为访客结账
      • 用户已登录
    • 通过电子邮件和移动推送通知进行通知
  • 对于酒店或租赁管理员(供应商/房东)
    • 管理员(接待员/经理/租赁所有者):管理房间库存并帮助客人办理入住和退房
    • 清洁工:定期清理房间

架构

组件

库存 <> 预订 <> 用户(客人和房东)

供应商在库存中提供他们的房间详情。用户可以相应地搜索、获取和预订房间。在预订房间后,用户的付款也会更改 reserved_roomstatus。您可以在 这篇文章 中查看数据模型。

如何查找可用房间?

  • 按位置:使用 空间索引 进行地理搜索,例如 geo-hash 或四叉树。
  • 按房间元数据:在查询数据库时应用过滤器或搜索条件。
  • 按入住和退房日期及可用性。两种选择:
    • 选项 1:对于给定的 room_id,检查今天或更晚的所有 occupied_room,将数据结构转换为按天的占用数组,最后在数组中找到可用的时间段。这个过程可能会耗时,因此我们可以建立可用性索引。
    • 选项 2:对于给定的 room_id,始终为占用的日期创建一个条目。这样更容易按日期查询不可用的时间段。

对于酒店,同步数据

如果这是一个酒店预订系统,那么它可能会发布到 GDS、聚合器和批发商等预订渠道。

酒店预订生态系统

为了在这些地方同步数据,我们可以

  1. 使用幂等性重试来提高外部调用的成功率,并确保没有重复订单
  2. 向外部供应商提供 webhook 回调 API,以在内部系统中更新状态。

支付与记账

数据模型:复式记账

为了执行支付,由于我们调用外部支付网关,如银行或 Stripe、Braintree 等,保持不同地方的数据同步至关重要。我们需要在交易表和外部银行及供应商之间同步数据。

提醒/警报的通知者

通知系统本质上是一个延迟调度器(优先队列 + 订阅者)加上 API 集成。

例如,每日定时任务将查询数据库以获取今天要发送的通知,并按日期将其放入优先队列。订阅者将从优先队列中获取最早的通知,并在达到预期时间戳时发送。如果没有,则将任务放回队列,并让 CPU 空闲以进行其他工作,如果今天有新的警报添加,可以中断此过程。