我对网络抓取工具很有经验,但是,这个问题与性能和规模有关。我需要在一段时间内请求并抓取150,000个网址(大多数网址是每15分钟一次,这使得每分钟大约有10,000个请求)。这些页面具有相当数量的数据(每页约200kb)。我们的数据库(MSSQL)中存在150,000个URL中的每一个,其中包含上次爬网日期的时间戳,以及我们知道何时再次爬行的时间间隔。
这是我们获得额外复杂层的地方。他们有一个API,每次通话最多允许10个项目。我们需要的信息部分仅存在于API中,部分仅存在于网页上。所有者允许我们进行Web呼叫,他们的服务器可以处理它,但是,他们无法更新其API或提供直接数据访问。
所以流程应该是这样的:从数据库获取间隔已经过去并需要被抓取的10条记录,然后点击API。然后,批量为10的每个项目都需要各自的Web请求。一旦请求返回HTML,我们就会解析它并更新数据库中的记录。
我有兴趣就处理基础设施的正确方法提出一些建议。假设多服务器环境有一些业务需求:
类似于多服务器阻塞集合(Azure队列?),自动调度轮询队列的VM,单个数据库主机服务器,也由向用户显示数据的MVC应用程序查询。 非常感谢任何建议或批评。
答案 0 :(得分:2)
<强>信息强>
我回应了Evandro的评论,并将探索事件中心的服务总线消息队列,以加载计算节点要处理的队列。消息队列支持记录锁定,根据您的写作可能很有吸引力。
计算选项
我也同意Azure Functions将为扩展计算/处理操作提供一个很好的平台(调用API和刮取HTML)。此外,Azure功能可以由消息队列,事件中心或事件网格触发。 [注意:Event Grid允许您使用持久消息传递连接各种Azure服务(pub / sub)。因此,它可能会在您的场景中发挥有用的中间人角色。]
计算的另一个选项可能是Azure容器实例(ACI),因为您可以根据需要启动容器来处理您的记录。这不具有与函数相同的自动缩放功能,也不支持直接绑定操作。
数据处理问题(入口/出口)
确实Azure不会对数据进入收费,但是任何离开Azure的数据都会在每月最初的5 GB之后收取出口费用。 [https://azure.microsoft.com/en-us/pricing/details/bandwidth/]
您应该能够让Azure Functions函数调用API,抓取HTML并写入数据库。您可能必须将它们分解为单独的函数,但您可以直接或使用LogicApps轻松地将函数链接在一起。