天才一秒记住【狂风中文网】地址:https://www.kfzw.net
他盯著陈哲看了两秒,然后问了一个更细的问题:“如果让你设计一个多线程的爬虫系统,抓取一万个网页,你会怎么处理线程池的大小?”
陈哲想了想,开口:“先看瓶颈在哪。
如果是i0阻塞,线程池大小可以设大一点,一般设100到200。
但也要看目標网站的承受能力,不能把人家的伺服器打崩了。
所以要用信號量限流,或者用队列控制並发数。”
“如果伺服器返回429呢?”
“加退避。
指数退避,第一次等1秒,第二次等2秒,第三次等4秒。
如果连续失败超过三次,就把这个url丟回队列,等后面再重试。”
本又问:“那如果队列满了呢?”
“满了就阻塞生產者。
或者用有界队列,满了之后生產者等待,等消费者空出位置。”
本的眉头没有鬆开。
他又写了一行字:“你怎么保证每个线程拿到的url不会重复?”
陈哲的手指在膝盖上轻轻敲了一下。
这个问题比他预想的深一不是问怎么去重,是问分布式的去重。
“用布隆过滤器。”
他说,“每个线程拿url之前先过一遍布隆过滤器,已经爬过的就跳过。
布隆过滤器可以用redis的bitmap实现,多个线程共享。
误差率可以通过哈希函数个数和位数组大小控制,一般能接受千分之一的误判,少爬几个页面问题不大。”
本点了点头。
但他没停。
“如果布隆过滤器误判漏了一个重要页面呢?”
陈哲这次真的停住了。
他沉默了两秒,然后开口,声音很平。
“用確定性去重做备份。
布隆过滤器只是第一层过滤,漏掉的页面可以靠第二层校验,比如把url的哈希存在redis的set里,精確去重。
但set的內存占用太大,所以可以用布隆过滤器做预筛选,set做兜底。”
本盯著他,又问:“那如果set也扛不住呢?”
陈哲的手指停住了。
他看著本的眼睛,沉默了三秒。
然后他嘆了口气,声音里带著一点无奈,又好像只是很坦诚。
“这个我不知道了。”
他顿了顿,又说了一遍,语气更轻,像是自言自语。
“学艺不精。
没做过这么大的量,没碰到过这种级別的瓶颈。”
本的目光在他脸上停了两秒,像是想確认什么。
桌上安静了片刻。
提米在旁边嘖了一声,替陈哲解围:“本,你这题出得也太偏了。
分布式爬虫的去重方案,那是架构师才需要考虑的问题。
本章未完,请点击下一章继续阅读!若浏览器显示没有新章节了,请尝试点击右上角↗️或右下角↘️的菜单,退出阅读模式即可,谢谢!