分布式抓取和速率限制/流量控制

时间:2018-07-23 09:23:26

标签: elasticsearch redis web-crawler rate-limiting flow-control

我正在运行与网络搜寻器配合使用的利基搜索产品。当前的搜寻器是一个(PHP Laravel)工作人员,其搜寻URL并将结果放入Elastic Search引擎中。系统以X毫秒的间隔连续不断地重新爬网找到的URL。

这很好地为我服务,但是随着一些新的大型客户的到来,爬虫将达到极限。我需要将系统重新设计为分布式爬网程序,以加快爬网速度。问题是下面的规格组合。

系统必须遵守以下2条规则:

  1. 多名工人(并发问题)
  2. 每个客户的
  3. 可变速率限制。我需要非常确定,系统不会每隔X毫秒对客户端X进行爬网。

我尝试过的事情:

  • 我尝试将URL放在MySQL表中,然后让工作人员根据clients和urls表中的last_crawled_at时间戳查询要爬网的URL。但是MySQL不喜欢多个并发工作器,我会遇到各种各样的死锁。

  • 我尝试将URL放入Redis引擎中。我得到了一些帮助,但是仅使用了Lua脚本,该脚本为正在服务的每个客户端检查并设置了到期密钥。这一切都让人感到骇然。

  • 我考虑过要填充常规队列,但这会违反规则2,因为我不能100%确定工作人员可以“实时”处理队列。

有人能解释我大男孩是怎么做到的吗?我们如何让多个进程根据一些条件(例如,限制客户端的速率)来查询大量的url列表,并确保仅将URL分发给1位工作者?

理想情况下,除了Elastic之外,我们不需要其他具有所有可用/找到的url的数据库,但是我认为这不可能吗?

1 个答案:

答案 0 :(得分:0)

看看StormCrawler,它是一个带有Elasticsearch模块的分布式Web搜寻器。它是高度可定制的,并且通过尊重robots.txt并默认情况下每个主机或域具有一个线程来强制执行礼貌。