SWE · Onsite System Design

Airbnb 搜索与下单查询系统:时间、地理位置和事件关联

Onsite SD 题目问查询用户搜索和下单信息,并支持指定时间与地理位置;按事件关联、时空索引与权限设计。

题目重点:Onsite SD 题目问查询用户搜索和下单信息,并支持指定时间与地理位置;按事件关联、时空索引与权限设计。

题意与假设

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

  • 训练版 SearchEvent 含 userId/searchId/eventTime/搜索地点,BookingEvent 含 userId/bookingId/searchId?/eventTime/listingGeo;是否有 searchId 直接关联题目未披露。
  • 位置过滤训练版按搜索目的地或被订 listing 的地理单元由调用方显式指定,不混两者。
  • 只允许授权的运营/本人按权限查日志,位置与搜索记录属于敏感行为数据,输出最小化并留审计。

解题路线

  1. 先定义用户故事:查某用户历史、按时间/地理范围找搜索与预订、还是分析 search→booking 转化;不同目的决定索引和聚合口径。
  2. 摄取搜索/下单事件时校验 userId、时间、位置与可选 searchId,保存不可变事件并做去重;若无直接 searchId,归因必须用时间窗/会话规则,不能凭同用户就认定一一对应。
  3. 原始事件按日期分区,建立 userId+eventTime 访问路径和地理单元(如 geohash/网格)+eventTime 的检索路径;精确圆形/多边形查询对网格候选做二次空间过滤。
  4. 组合条件先用高选择性索引召回,随后按另一维过滤,稳定按 (eventTime,eventId) 游标分页;跨来源聚合可建按用户/时间的读模型,但需展示摄取延迟与晚到修正。
  5. 监控查询 p99、数据新鲜度、位置过滤误差、索引热区、权限访问及保留/删除一致性。

手动走一遍

训练例:用户 u 在 10:00 搜索纽约,11:00 预订波士顿房源。按搜索地点=纽约查应返回 search event;按预订房源地点=纽约查不应返回该 booking。若题目要 search→booking 归因,还需明确是否存在 searchId 或限定窗口。

规模与取舍

索引查询约 O(log N+候选数+分页输出);时空网格精度越细,查询需跨更多格但误报更少,粗格相反。题目无数据量,不能指定分片/保留天数。

易错点与追问

容易失分的边界

  • 把搜索地点当预订房源地点。
  • 没有事件关联键仍宣称精确归因。
  • 先扫全表再在应用层筛时间/地理。
  • 只用 geohash 前缀而不做边界二次过滤。
  • 用户行为数据无权限与删除策略。

继续深挖

  • 没有 searchId 时如何定义转化?
  • 跨设备 userId 如何合并?
  • 晚到订单如何修正统计?
  • 跨 geohash 边界的半径查询怎么保证不漏?
✓已复制微信号!