SWE L4/L5 · System Design / 设计追问

百亿页面周期爬虫:按host礼貌调度与持久化frontier

面向搜索索引,支持周期重抓,暂不渲染JavaScript。

题目重点:面向搜索索引,支持周期重抓,暂不渲染JavaScript。

题意与假设

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

  • 百亿页面、周期重抓、下游搜索索引、不做JS渲染是题目场景。24小时全量重抓是额外容量追问。
  • robots、host限速与站点错误重试遵守配置策略;实时公开规则如需落实现行规范应另查官方文档。

解题路线

  1. frontier由URL状态表、优先候选队列、host可用时间堆构成。先按优先级选可抓URL,再由host串行/并发上限与nextAllowedTime约束实际发出。不能只用全局高优先队列压垮单站。
  2. URL规范化有风险:删除query参数可能改变内容。精确URL哈希作为身份,Bloom只作预筛或低价值候选过滤,重要URL必须精确确认避免误判漏抓。内容checksum处理精确重复,近似签名只产生候选。
  3. 按host分片,worker持租约与fencing token;持久化frontier与抓取状态。失败重试保留attempt/nextTry,解析出的新URL先落库再发布,不让worker崩溃漏掉闭环。
  4. 重抓由新鲜度/变化率/重要性预算调度;限制host总量、URL模式与深度来处理日历陷阱。重定向和跨域发现重新经过身份与host调度,不能绕过限速。

手动走一遍

100亿/86400≈11.57万页/秒;假设平均100KB原始载荷,约11.6GB/s,约92.6Gbps不含重试、TLS和副本。DNS缓存只是一个瓶颈,并不能证明足够。同host有100万高优先URL但允许1请求/秒,24小时最多抓86400条;全量24小时目标可能与礼貌合同不可同时满足,要报告容量矛盾。

规模与取舍

存储/传输成本按页面数×平均大小;scheduler候选操作通常O(logH)或分片队列成本,H是活跃host数。观测抓取覆盖、新鲜度、host违规、重复率和恢复漏抓。

易错点与追问

容易失分的边界

  • 用Bloom误判为已访问会漏抓,不可称准确去重。
  • 一致性hash仅分配host,不自动防止两个持旧租约worker同时抓取。

继续深挖

  • robots策略缓存失效与抓取中变化如何处理?
  • 重要页面的优先级、礼貌等待与24小时目标冲突时如何给产品可量化选择?
✓已复制微信号!