2012-05-31 51 views
1

我想創建一個Web爬蟲,需要一些網站的內容和在Blob存儲保存它一個Web爬蟲。在Azure上做到這一點的正確方法是什麼?我應該啓動一個Worker角色,並使用Thread.Sleep方法讓它每天運行一次?創建使用Windows Azure的

我也想知道,如果我用這個Worker角色,如何將它,如果我創建它的兩個實例工作?我注意到使用「Compute Emulator UI」命令「Trace.WriteLine」可以同時在兩個實例上工作,有人可以澄清這一點。

我創建使用PHP一樣爬行,並設置cron作業一旦啓動腳本一天,但花了6個小時搶的全部內容,這就是爲什麼我要使用Azure上。

回答

0

每天運行一次單個工人的角色可能是最好的辦法。我不會使用線程睡眠,因爲您可能需要重新啓動實例,然後可能會根據您的編程在一天之前或晚於一天之前啓動。將任務命令作爲消息放在Azure隊列上並將其從隊列角色拾取後出隊,然後在Azure隊列中添加一個新的任務命令一次。

1

考慮到工人的角色基本上是Windows 2008的服務器,你可以運行你會在本地運行相同的代碼。

不過,考慮一下角色實例可能會重啓的幾個原因:操作系統更新,崩潰等。在這些情況下,可能會失去正在完成的工作。所以......你可以用幾種方法處理這個問題:

  • 隊列。在命令隊列中放置一條消息。如果是每天一次的任務,則可以在完成處理之前的消息時將消息推送到隊列中。請注意,您可以在信息上留下隱形超時時間,因此一天內不會顯示。在處理過程中發生故障時,消息將重新出現在隊列中,而另一個實例可以將其提取出來。您還可以隨時修改該消息,以跟蹤您的狀態。
  • 調度。只要確保只有一個實例正在運行(通過互斥體)。一個簡單的方法是嘗試獲取blob上的寫鎖(只能有一個)。

有一件事需要考慮的是把你的網絡抓取分解成單獨的任務(網址?)並將它們分別放在隊列中?有了這個,你就可以擴展,運行多個實例,或者在同一個實例中運行多個線程(因爲web抓取可能是一個阻塞操作,而不是一個cpu和帶寬密集型操作)。