本文参考自:https://github.com/donnemartin/system-design-primer/blob/master/solutions/system_design/web_crawler/README.md
作者也有添加自己想法。
第一步:为用户需求和约束列出大纲
用户需求
- 服务: 爬一系列URL
- 生成页面的反向索引(https://en.wikipedia.org/wiki/Reverse_index)与关键词
- 生成页面标题与缩略图,这些内容是静态的,不会随着搜索而变化
- 具有高可用性high availability
- 用户: 输入一个搜索关键词,然后可以看到所有相关页面的列表
约束和假设
状态假设
- 流量不是均匀分布。有些搜索很热门,有些就不是。
- 只支持匿名用户,换言之,不会存储用户登录信息以及个性化内容。
- 生成搜索结果应该很快。
- 网页爬虫不应该死循环。通常,如果URL 链接graph有一个cycle,就会陷入死循环。
- 1 billion 个URL等待爬取
- 每个页面应该有规律的被爬取,这样可以保证页面的新鲜。
- 平均起来,每个页面每周应该被刷新一次,更加流行的网页会刷新的更频繁。每个月会爬取4 million页面。
- 平均每个页面占据500KB。
- 每个月会有100million次搜索。
计算使用
- 每个月需要2PB存储空间
- 500KB x 4 billion