舒文小说网

舒文小说网>我的美利坚牧场 > 第72章 模擬器更新51k大章(第2页)

第72章 模擬器更新51k大章(第2页)

他顿了顿。

“具体閾值要看业务。一般估算的话,单核能撑的qps上限除以cpu占比,再除以並发係数。比如单核能撑1000qps纯i0,如果每个请求有10%的cpu计算,那实际能撑的qps大概在100左右。超过这个数就需要多进程或者换语言。”

本听完,没说话。

他低头在白板上又写了一行字。这次写得很慢,像是在斟酌什么。

“你写过多线程的生產级代码吗?”

陈哲看著那行字,沉默了两秒。

然后他摇了摇头。

“没有。我写的都是单机脚本和web后端。多线程只在demo里跑过,没上过生產。”

本的眉头微微动了一下。

他盯著陈哲看了两秒,然后问了一个更细的问题:“如果让你设计一个多线程的爬虫系统,抓取一万个网页,你会怎么处理线程池的大小?”

陈哲想了想,开口:“先看瓶颈在哪。如果是i0阻塞,线程池大小可以设大一点,一般设100到200。但也要看目標网站的承受能力,不能把人家的伺服器打崩了。所以要用信號量限流,或者用队列控制並发数。”

“如果伺服器返回429呢?”

“加退避。指数退避,第一次等1秒,第二次等2秒,第三次等4秒。如果连续失败超过三次,就把这个url丟回队列,等后面再重试。”

本又问:“那如果队列满了呢?”

“满了就阻塞生產者。或者用有界队列,满了之后生產者等待,等消费者空出位置。”

本的眉头没有鬆开。

他又写了一行字:“你怎么保证每个线程拿到的url不会重复?”

陈哲的手指在膝盖上轻轻敲了一下。这个问题比他预想的深一不是问怎么去重,是问分布式的去重。

“用布隆过滤器。”他说,“每个线程拿url之前先过一遍布隆过滤器,已经爬过的就跳过。布隆过滤器可以用redis的bitmap实现,多个线程共享。误差率可以通过哈希函数个数和位数组大小控制,一般能接受千分之一的误判,少爬几个页面问题不大。”

本点了点头。但他没停。

“如果布隆过滤器误判漏了一个重要页面呢?”

陈哲这次真的停住了。

他沉默了两秒,然后开口,声音很平。

“用確定性去重做备份。布隆过滤器只是第一层过滤,漏掉的页面可以靠第二层校验,比如把url的哈希存在redis的set里,精確去重。但set的內存占用太大,所以可以用布隆过滤器做预筛选,set做兜底。”

本盯著他,又问:“那如果set也扛不住呢?”

陈哲的手指停住了。

他看著本的眼睛,沉默了三秒。

然后他嘆了口气,声音里带著一点无奈,又好像只是很坦诚。

“这个我不知道了。”

他顿了顿,又说了一遍,语气更轻,像是自言自语。

“学艺不精。没做过这么大的量,没碰到过这种级別的瓶颈。”

本的目光在他脸上停了两秒,像是想確认什么。

桌上安静了片刻。

提米在旁边嘖了一声,替陈哲解围:“本,你这题出得也太偏了。分布式爬虫的去重方案,那是架构师才需要考虑的问题。他一个刚入行的新人,能想到布隆过滤器加set兜底已经很不错了。”

全民超人点头:“就是。你问他gil、问线程池、问退避策略,这些还算正常。问到分布式去重,那已经超出普通开发的范围了。”

莱拉也帮腔:“我工作三年了,也没设计过这种量级的系统。平时业务里碰到这种需求,直接用现成的消息队列和分布式框架,谁会自己造轮子?”

本没说话,只是看著陈哲。

陈哲靠回椅背上,端起那杯凉透的咖啡,喝了一口。苦的。他的表情很坦然,像是一个真的不会的人。

“確实不会。”他又说了一遍,声音很稳,没有辩解的意思。

codemaster—us从桌子另一头站起来,走到这边,看了一眼白板上那行字。

热门小说推荐

最新标签