1

我想创建一个网络爬虫,它获取一些网站的内容并将其保存在 blob 存储中。在 Azure 上执行此操作的正确方法是什么?我应该开始一个 Worker 角色,并使用 Thread.Sleep 方法让它每天运行一次吗?

我还想知道,如果我使用这个 Worker Role,如果我创建它的两个实例,它将如何工作?我注意到使用“Compute Emulator UI”命令“Trace.WriteLine”同时在两个实例上工作,有人可以澄清这一点。

我使用 php 创建了相同的爬虫并将 cron 作业设置为每天启动一次脚本,但是抓取整个内容需要 6 个小时,这就是我想使用 Azure 的原因。

4

3 回答 3

4

这是正确的做法,截至 2014 年 1 月,Microsoft 推出了 Azure WebJobs,您可以在其中创建项目(例如控制台),并将其作为计划任务运行(发生一次,重复)

https://azure.microsoft.com/en-us/documentation/articles/web-sites-create-web-jobs/ http://www.hanselman.com/blog/IntroducingWindowsAzureWebJobs.aspx

于 2016-01-02T05:37:41.807 回答
1

考虑到辅助角色基本上是 Windows 2008 Server,您可以运行在本地运行的相同代码。

但请考虑,角色实例可能会重新启动的原因有多种:操作系统更新、崩溃等。在这些情况下,您可能会丢失正在完成的工作。所以......你可以通过几种方式处理这个问题:

  • 队列。将消息放在命令队列上。如果是一天一次的任务,您可以在处理完上一条消息后将消息推送到队列中。请注意,您可以在消息上设置隐身超时,因此它不会出现一天。如果在处理过程中发生故障,消息将重新出现在队列中,并且不同的实例可以将其拾取。您还可以随时修改消息,以跟踪您的状态。
  • 调度器。只需确保只有一个实例在运行(通过互斥锁)。一个简单的方法是尝试获得一个 blob 上的写锁(只能有一个)。

要考虑的一件事是将您的网络爬网分解为单独的任务(网址?)并将它们单独放在队列中?有了这个,您就可以扩展,在同一个实例中运行多个实例或可能的多个线程(因为网络爬取可能是一个阻塞操作,而不是 CPU 和带宽密集型操作)。

于 2012-05-31T19:55:37.753 回答
0

每天运行一次的单个工作者角色可能是最好的方法。不过,我不会使用线程睡眠,因为您可能想要重新启动实例,然后根据您的编程,它可能会在一天之前或一天之后开始。将任务命令作为消息放在 Azure 队列中,并在它被辅助角色拾取后将其出列,然后在 Azure 队列中添加新的任务命令一次。

于 2012-05-31T19:55:12.187 回答