每分钟10,000次HTTP请求性能

时间:2018-05-23 01:18:48

标签: sql-server azure web-scraping web-crawler httpwebrequest

我对网络抓取工具很有经验,但是,这个问题与性能和规模有关。我需要在一段时间内请求并抓取150,000个网址(大多数网址是每15分钟一次,这使得每分钟大约有10,000个请求)。这些页面具有相当数量的数据(每页约200kb)。我们的数据库(MSSQL)中存在150,000个URL中的每一个,其中包含上次爬网日期的时间戳,以及我们知道何时再次爬行的时间间隔。

这是我们获得额外复杂层的地方。他们有一个API,每次通话最多允许10个项目。我们需要的信息部分仅存在于API中,部分仅存在于网页上。所有者允许我们进行Web呼叫,他们的服务器可以处理它,但是,他们无法更新其API或提供直接数据访问。

所以流程应该是这样的:从数据库获取间隔已经过去并需要被抓取的10条记录,然后点击API。然后,批量为10的每个项目都需要各自的Web请求。一旦请求返回HTML,我们就会解析它并更新数据库中的记录。

我有兴趣就处理基础设施的正确方法提出一些建议。假设多服务器环境有一些业务需求:

  • 一旦准备好抓取URL记录,我们希望确保它只被单个服务器抓取并运行。如果两台服务器同时检查并运行,则可能会破坏我们的数据。
  • 工作量可能会有所不同,目前,它是150,000个url记录,但可以更低或更高。虽然我预计每天不会有超过10%的变化,但进行某种自动调整会很不错。
  • 在每个请求返回HTML之后,我们需要解析它并使用各个数据块更新数据库中的记录。一些主机提供商允许免费传入数据,但收取传出费用。理想情况下,请求网页然后解析数据的代码库也具有直接的SQL访问权限。 (与微服务方法相反)

类似于多服务器阻塞集合(Azure队列?),自动调度轮询队列的VM,单个数据库主机服务器,也由向用户显示数据的MVC应用程序查询。 非常感谢任何建议或批评。

1 个答案:

答案 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轻松地将函数链接在一起。