系统设计[实战篇-BotNet Web Crawler]
题目是设计 web crawler,每个web crawler都是一个被hack的device(这里有坑),crawler的内容无所谓,有一个初始页面然后,crawl当前页面以及link的页面。
居然是高频题。。。我要被雷死了。。
Facebook | System Design | A web crawler that will crawl Wikipedia - LeetCode Discuss
Clarification:
- Can the number of crawler change?
- Consistent hashing handle node failures (redistribute crawled urls)
这个就是考察consistent hashing,没想到的基本gg咯。
居然还有论文
论文分为两块,P2P protocol和Peer本身内部的代码。
P2P protocol
P2P主要是两个功能,1. Task Distribution (用DHT, distributed hash table 去找应该handle 这个url的node) 2. Duplicate Check (同样用DHT去找指定node去重)
比较有意思的是:
- url不应该是整个去做key,而只取domain,这样一个node总是负责所有domain下的url,会简化设计并且提供更好的locale
- 一个DHT不够,domain需要一个,content也需要一个,content那个用来去重,原因是可能有不同的url的内容是一样的,如果处理domain的node同时去重的话,就会漏掉这种情况
- 加减node还是需要一个bootstrap service (但是这题并没有提到加减node的情况)
- Bloom Filter 还是常用手段,主要以极低的Memory去快速查询membership
- 注意DHT的lookup是log(N),简单理解就是hash完的value需要binary search才能找到谁去handle他
Peer Internal Architecture
Node 主要maintain 5 个东西
- Crawl Jobs (URL to crawl)
- Processing Jobs (URL to extract)
- Seen URLs (Bloom Filter)
- Seen Content (Bloom Filter)
- Routing Table (DHT,知道URL和Content分别该去找哪个node)
Open Question
- Security, expose http endpoint, anyone can call, but does it matter?
- Node failure,被动node exit,notify bootstrap service,进行node的exit程序,或者也可以introduce一个额外的hash,找寻node进行backup