2011-11-27 92 views
5

我有一個簡單的Azure Worker角色,每隔幾秒執行一次任務。以下是完成此操作的代碼。以不同的間隔在Azure Worker角色中執行任務

public override void Run() 
    { 
     try 
     { 
      while (true) 
      { 
       DoSomething(); 
       System.Threading.Thread.Sleep(3000); 
      } 

     } 
     catch (Exception ex) 
     { 
      Log.Add(ex, true); 
     }    
    } 

我現在想要做的是添加第二個任務DoSomethingElse(),每天只觸發一次。我認爲一對夫婦的方式來做到這一點的:

  1. 添加調用新任務每n個循環
  2. 添加條件邏輯,目前的時間比較的規定時間的新任務計數器天
  3. 使用一些TBD調度庫(如Quartz.NET)

前兩種解決方案罷工我很脆無需額外的代碼來處理,其中該服務被停止並重新啓動的情況。第三種解決方案讓我覺得可能是過度殺傷力。

我的問題是,在Azure工作者角色內以不同時間間隔安排任務的最佳做法是什麼?我有一個輕微的偏好,堅持使用直接的.NET,而不是使用第三方庫(儘管我不排除它)。

注意,#3以上來自這些老版本的問題Recommend a C# Task Scheduling Library

回答

2

前兩個選項是最簡單的,但他們是脆弱 - 尤其是在角色可循環/負載均衡等方面的雲......如果持久在內存中,甚至是基於雲的磁盤中,那麼它就會變得脆弱。

在其他第三方選項之外,您可以考慮將計劃和執行數據保存到外部存儲(表服務,sql azure等)。在定期計時器上,輔助角色可以查詢將要執行的作業,記錄開始並運行作業。這也使您可以擴展工作角色的數量,因爲它的持久性是外部的。

這可能會變得很複雜,但如果通過頻率和記錄運行時間保持簡單,它可以相當簡單。

+0

讓我們暫時將執行數據保存到SQL Azure數據庫。我可以在DoSomethingElse()中構建一個簡單的檢查,用於確定數據庫的上次運行時間。這意味着要ping數據庫來每3秒執行一次檢查。這是一個壞主意嗎?這是很多不必要的數據庫訪問。但是再次,數據庫服務器不太可能因這種微不足道的交易而緊張。思考? – hughesdan

1

Steve Marx在Windows Azure using blob leases上寫了一篇關於how to build a task scheduler的博客文章,我想你會發現這非常有用。

+0

他解釋瞭如何分配要排定的任務。但是他沒有提到任何關於初始邏輯本身如何被觸發的事情,即工作者角色如何知道「現在」是醒來並檢查表中是否安排了任何任務的時間?正如您所指出的,好的文章 – DeepSpace101

+0

,工作者角色本質上是一個無限循環的程序。在那裏你可以根據你的願望編碼支票 - 大概是以一定的時間間隔運行,每隔一分鐘,每小時,每一次運行,並在每次運行時檢查某個時間表的數據庫,如果有任何需要的話。您可能需要使用上次執行時間和可能的結果來更新該數據庫。 –

相關問題