我正在运行与网络搜寻器配合使用的利基搜索产品。当前的搜寻器是一个(PHP Laravel)工作人员,其搜寻URL并将结果放入Elastic Search引擎中。系统以X毫秒的间隔连续不断地重新爬网找到的URL。
这很好地为我服务,但是随着一些新的大型客户的到来,爬虫将达到极限。我需要将系统重新设计为分布式爬网程序,以加快爬网速度。问题是下面的规格组合。
系统必须遵守以下2条规则:
我尝试过的事情:
我尝试将URL放在MySQL表中,然后让工作人员根据clients和urls表中的last_crawled_at时间戳查询要爬网的URL。但是MySQL不喜欢多个并发工作器,我会遇到各种各样的死锁。
我尝试将URL放入Redis引擎中。我得到了一些帮助,但是仅使用了Lua脚本,该脚本为正在服务的每个客户端检查并设置了到期密钥。这一切都让人感到骇然。
我考虑过要填充常规队列,但这会违反规则2,因为我不能100%确定工作人员可以“实时”处理队列。
有人能解释我大男孩是怎么做到的吗?我们如何让多个进程根据一些条件(例如,限制客户端的速率)来查询大量的url列表,并确保仅将URL分发给1位工作者?
理想情况下,除了Elastic之外,我们不需要其他具有所有可用/找到的url的数据库,但是我认为这不可能吗?
答案 0 :(得分:0)
看看StormCrawler,它是一个带有Elasticsearch模块的分布式Web搜寻器。它是高度可定制的,并且通过尊重robots.txt并默认情况下每个主机或域具有一个线程来强制执行礼貌。