SWE / System Design · Onsite System Design

Rippling Hotel Booking:第三方房态、搜索索引与预订一致性

围绕外部酒店 API 的数据导入、地理搜索、可用房查询与确认预订,解释缓存展示与最终库存的边界。

题目重点:围绕外部酒店 API 的数据导入、地理搜索、可用房查询与确认预订,解释缓存展示与最终库存的边界。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版平台只做第三方酒店聚合:酒店/房型元数据可本地缓存,实时房态由酒店持有最终事实;题目没有说能否拿到 inventory change webhook,也没有房间 ID/时区/取消政策。
  • 搜索位置按经纬度半径作为一轮明确追问,筛选入住/退房日期、人数与币种为酒店业务常见训练参数,不称其为题目确定输入。

解题路线

  1. 接入层为各酒店维护 API adapter、外部 hotel/room/rate ID 映射、数据更新时间与可靠性指标;无 API 的酒店不能假设爬虫能稳定或合法取得可预订库存。
  2. 搜索分两步:本地地理索引召回半径内酒店及可选筛选,然后从候选酒店取得所需日期的房态/报价;本地陈旧缓存可帮助快速初筛,但 UI 必须说明价格和房态以最终确认结果为准。
  3. 预订状态机:创建幂等 request_id→酒店实时 availability/price quote→酒店 hold 或 confirm→本地记录外部 confirmation_id→支付/最终确认。若第三方不支持 hold,报价和预订间存在竞争,需接受售罄并给替代方案。
  4. 第三方调用超时后不能盲目重试成双订:先按外部幂等键或 request_id 查询状态;没有幂等 API 时本地标 `unknown` 并对账/人工处理。取消、部分失败和付款补偿要走独立状态转移。
  5. 数据表/索引按访问路径拆:Hotel(geo,metadata)、RoomType(hotel_id,capacity)、Offer(hotel_id,room_type,date,version/expiry)、Booking(user,external_ref,status,idempotency_key);外部房态不因本地缓存存在就变成强一致。

手动走一遍

两位平台用户同时看到酒店 H 的最后一间房:两人本地搜索都命中,但第一人先从酒店 API 成功 confirm,第二人 confirm 返回 sold_out。平台不能凭本地标记向第二人承诺成功;要刷新报价、释放任何本地支付预留并返回替代选项。

规模与取舍

本地酒店地理召回可用空间索引缩小候选数,但实时房态检查成本随候选酒店数×外部 API 延迟增长;并发 100 个候选通常需分批/超时预算,不可串行承诺低延迟。题目没有酒店数、QPS 或 API SLA,不能填固定节点数。

易错点与追问

容易失分的边界

  • 把缓存房态当预订时的最终库存。
  • 假设每家酒店都有 webhook、hold 和幂等 API。
  • 预订超时直接换新 request ID 重试,可能重复订。
  • 只画酒店表而没有日期/房型/报价索引和外部 ID 映射。
  • 把显示已预订与酒店最终 confirmation 混为一个状态。

继续深挖

  • 酒店 API 没有 hold 时怎样处理最后一间房竞争?
  • 确认成功但本地 DB 写失败时如何恢复?
  • 搜索缓存多久刷新,如何展示过期价格?
  • 如果一批酒店没有 API,是否纳入实时可预订库存?
✓已复制微信号!