SWE · VO System Design

LinkedIn 分布式倒排索引:Posting List 交集与热门词读瓶颈

从两个有序 docID 列表的交集扩展到分片索引、查询合并、更新和高频词缓存。

题目重点:从两个有序 docID 列表的交集扩展到分片索引、查询合并、更新和高频词缓存。

题意与假设

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

  • 训练设计每个 term 对应按 docID 升序、无重复的 posting list;AND 查询取所有词都出现的文档。实际 source list 的 99 同时出现在 orange 与 juice,题目却给交集只写 13、25,说明示例缺失过滤/拼写规则,不能照抄为数学交集。
  • 文档有版本和删除标记;词项标准化、权限过滤、排序/分页是系统扩展而非题目明示约束。

解题路线

  1. 两条有序 posting list 用双指针:相等输出并双移,小的一侧前进;多词先按 posting 长度从短到长交,避免先扫超长高频词。长短差异大时用较短表驱动对较长表做 galloping/binary search。
  2. 分片方案要比较按 term 分片与按 doc 分片:term 分片单词读取集中但热门词会成热点、多词查询跨分片;doc 分片写入与权限/更新局部化,但查询必须广播各文档分片再合并。可按 term 热度复制热点 posting、缓存常见查询中间交集。
  3. 新增/删除文档先写可恢复变更日志,异步构建 segment posting;查询合并热增量和不可变 segment,按文档版本过滤 tombstone。热点 term posting 使用压缩、跳表/block-max 索引减少 IO。
  4. 安全层在结果 docID 上或 posting 阶段做授权过滤;只缓存无权限信息的公共交集,租户/权限相关结果要隔离缓存键。监控查询 p95、fanout、热门词命中和索引滞后。

手动走一遍

orange=[1,13,20,25,74,99],juice=[10,13,14,15,25,99],纯集合交集应为 [13,25,99]。题目示例回答只列 [13,25],若 99 被删、无权限或有上限必须另给规则;题解先说明矛盾。

规模与取舍

两表长度 A、B,双指针 O(A+B) 时间、输出 O(R);短表驱动长表二分 O(A log B) 当 A≪B。分布式查询成本还含分片数 P 的网络 fanout、压缩 posting IO 和结果合并,题目未明确规模数字。

易错点与追问

容易失分的边界

  • 照抄题目漏掉共同 docID 99 却称纯 AND 交集。
  • 两个有序 list 先转巨大 set,丢掉顺序和压缩优势。
  • 所有关键词都按相同处理,不利用短 posting 先过滤。
  • term 分片热门词集中却无复制/缓存方案。
  • 权限不同的用户共享同一结果缓存。

继续深挖

  • 若 99 被删除或权限不可见,过滤放在哪层?
  • 词条每日更新数亿次如何维护 segment?
  • AND/OR 查询混合时规划器怎么选?
  • 热门单字词如何分散读负载?
✓已复制微信号!