使用 Azure Service Fabric 手动控制和生成作业处理代理

Using Azure Service Fabric to Manually Control and Spawn Job-Processing Agents

目前我正在研究使用 Azure Service Fabric 及其 Reliable Services 来实现我的问题域架构的可能性。

问题域:我目前正在研究分布式大规模网络爬行架构,涉及数十个并行代理,这些代理应该爬行网络服务器并下载资源以供进一步索引。

我发现了一篇描述基于 Azure 的分布式网络爬虫架构的有用学术论文:Link to .pdf paper 我正在尝试基于此设计实施和试用原型。

所以基本的高级设计外观如下图所示:

想法:中央网络爬虫系统引擎(进一步 - CWCE)运行无限循环,直到程序中止并获取服务总线队列消息,其中包含URL 个要抓取的页面。 CWCE 组件然后检查此 URL 的主机名,如果给定主机名的活动代理已经存在,则咨询代理注册器 SQL 数据库。如果不是,CWCE 然后执行以下过程之一:

  1. If number of alive agents (A_alive) is equal to Max value (agents upper bound limit, appropriate administrator) CWCE等待,直到A_alive < Max value

  2. 如果A_alive < Max,CWCE 会尝试创建新的代理并为其分配主机名。 (代理随后在 SQL 注册商数据库中注册)。

每个代理 运行 在它自己的分区上(URL 主机名,例如:example.com)并在发现外部主机名时递归地仅抓取该主机名的页面 URLs 并将它们添加到服务总线队列以供其他代理处理。

这种架构的好处是代理的横向扩展和爬行效率的近线性工作负载增加。

但是,我是Azure Service Fabric的新手,所以想问一下这个PaaS层是否能够解决这个问题?主要问题:

  1. 是否可以通过可编程代码手动创建新的网络爬虫代理实例,并使用 Azure Service Fabric 向它们传递主机名参数? (也许使用 FabricClient class 来操作集群和创建服务实例?)

  2. 哪种 ASF 编程模型最适合这种并行的 long-运行ning 代理场景? 无状态服务有状态服务Actor模型?每个代理可能 运行 作为长 运行ning 任务,因为它递归地抓取特定主机名 URLs 并侦听队列。

  3. 是否可以在运行应用期间控制和更改 Max alive agents 的上限?

  4. 是否可以拥有无​​限循环无状态服务 CWCE 组件,该组件不断侦听队列消息以产生新代理?

我不确定所选的 ASF PaaS 层是否是此分布式网络爬虫系统用例的最佳解决方案,因此您的见解对我来说非常宝贵。任何有用的资源链接也将非常有益。

Service Fabric 将允许您实现所需的体系结构。

  1. Would it be possible to manually create new web crawling agent instances through the programmable code and pass them hostname parameter using Azure Service Fabric? (Maybe using FabricClient class for manipulating cluster and creating service instances?)

是的。您将开发并部署到 Service Fabric 的服务将是 ServiceType。服务类型实际上并不 运行,相反,您可以从 ServiceType 创建实际的服务,这些服务被命名。单个服务(例如 ServiceA)将具有多个实例,以允许扩展和可用性。您可以通过编程方式创建和删除给定类型的服务并将参数传递给它们,因此每个服务都将知道要抓取的内容 URL。 检查示例 here.

  1. Which ASF programming model fits this parallel long-running agents scenario the best? Stateless services, stateful services or Actor Model? Each agent might run as long-running task, since it recursively crawls specific hostname URLs and listens for the queue.

我会选择无状态服务,因为它们在资源利用方面是最高效的,也是最容易管理的(不需要存储状态和管理状态、分区和副本)。你唯一需要考虑的是每一个服务最终都会崩溃重启,所以你需要将当前爬取的位置存储在永久存储中,而不是内存中。

  1. Would it be possible to control and change this upper bound limit of Max alive agents during runtime of application?

是的。节点(虚拟机)和 Azure 中的 Service Fabric 服务 运行,它们由虚拟机规模集管理。您可以轻松地从 VMSS 添加和删除节点,这将允许您调整所需的总计算和内存能力,并且实际服务数量已经由您控制,如第 1 点中所指定。

  1. Would it be possible to have infinite-loop stateless service CWCE component which continuously listens for the queue messages in order to spawn up new agents?

当然可以。消息驱动的微服务非常普遍。它在技术上不是一个无限循环,而是一个带有总线通信监听器的服务。我找到一个 here 作为参考,但我不知道它是否可以生产