2013-07-06 114 views
10

我正在開發一個計劃在Windows Azure上託管的網站。該網站將需要運行一些每日/每週的計劃作業,同步到各種第三方數據源,發送用戶通知等。它還應該能夠運行按需異步任務,如發送電子郵件給用戶等。Azure網站 - 計劃任務

我最初的想法是使用Azure雲服務來託管它,其中一個運行MVC 4和一個輔助角色的Web角色負責處理計劃任務,並將異步任務(發送電子郵件等)從隊列存儲中提取出來。然而,這會讓我付出代價,看到我需要爲計算時間付出雙倍的代價。

該項目可能證明這一成本在未來,但在業務開始之前,我真的更喜歡更便宜的選擇。因此我正在研究Azure網站。

我可以通過爲MVC網站使用Azure網站並讓工作人員角色運行taks將成本降低一半,但我很想聽聽其他方法,除了從我的手動觸發它們的明顯選項外管理模塊。

另外,我可以使用Azure網站將網站連接到我的域名並免費使用SSL嗎?

回答

4

看起來天青終於內置了正確的計劃 - see the Azure Scheduler documentation

雖然它在預覽和你最有可能使用REST API現在,我敢肯定,它不會在管理門戶中的功能可用之前。我一直在等待這個年齡!

+0

您還可以通過管理庫在常規.NET中使用它:http://fabriccontroller.net/blog/posts/a-complete-overview-to-get-started-with-the-windows-azure-scheduler/ –

+0

歡呼聲,看起來很有趣。它似乎比運行一個完整的bg工作人員便宜 – havardhu

+0

Azure調度程序是否廣泛可用?我沒有在我的門戶中看到它。 –

3

如果你很喜歡在node.js中編寫代碼,那麼看看Windows Azure Mobile Services。它有能力定義和執行計劃任務。更多關於這可以在這裏找到:http://www.windowsazure.com/en-us/develop/mobile/tutorials/schedule-backend-tasks/

另一種方法是使用Aditi的調度程序服務:http://www.aditicloud.com/

另一種選擇是編寫自己的調度程序並在Azure網站中託管該解決方案。我會推薦使用Quartz.net調度庫。它是免費的,開放源代碼並被許多人使用。

我仍然認爲去職位處理的工人角色路線是一個可行的解決方案。您可以做的是將前端基礎架構託管在Windows Azure網站中,並通過Windows Azure隊列與工作人員角色通信。假設您以超小型虛擬機大小託管2個工作角色實例,則每個月需花費大約30美元(0.02美元×2×750小時)。我寫了一篇關於構建自己的任務調度器的博客文章,並在不久之前將其託管在工作者角色中。你可以在這裏讀到一篇:http://gauravmantri.com/2013/01/23/building-a-simple-task-scheduler-in-windows-azure/

而且,我可以現場連接到我的域,並使用SSL免費使用 Azure網站?

我不這麼認爲。 Windows Azure網站不支持SSL。看看這裏的SSL定價:http://www.windowsazure.com/en-us/pricing/details/web-sites/

+0

在Windows Azure移動服務目前支持庫非常有限的名單,所以沒有太多,你可以在計劃任務做。 –

0

我只需要在第一個說,你是不正確約需要在Azure中的PaaS繳交雙倍:)

A「WebRole」(平臺作爲一種服務)僅僅是一個WorkerRole + IIS 。因此,由於您的邏輯需要放入計時器中的時間非常短,並且可能不會佔用大量資源,因此您可以在「WebRole」的OnStart中啓動後臺工作線程。 cs「文件,它位於您的Web應用程序內部。

這將導致您的Web應用程序以及您的小型員工任務託管在同一個虛擬機上 - 因此您只需支付一個。作爲一個觀點 - 如果你想要10個「背景」任務,但是他們不需要繁重的工作,也不需要獨立地進行縮放,那麼你也可以從一個單獨的主持或運行所有這些任務「WorkerRole」VM。

namespace MvcWebRole1 
{ 
    public class WebRole : RoleEntryPoint 
    { 
     public override bool OnStart() 
     { 
      // Start my background thread processing task. 
      MyBackgroundTaskThing.Start(); 

      return base.OnStart(); 
     } 
    } 
} 
+0

我已經按照https://azure.microsoft.com/en-in/documentation/articles/scheduler-get-started-portal/中的規定創建了一個演示。但我如何知道此任務是否已運行? ? –

2

您可以使用Timer類在Azure網站項目中運行調度程序。這樣,你可以將所有的東西封裝在你的ASP.NET MVC項目中。

信息關於Timer類:http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

我在Azure上的網站一個MVC項目測試這一點,可以確認它的工作原理。爲了得到這個設置,啓動裏面的Application_Start定時器()的Global.asax.cs的:

private Timer _timer; 
protected void Application_Start() 
{ 
    _timer = new Timer(1 * 60 * 1000); // 1 minute 
    _timer.Elapsed += (sender, e) => ScheduledTask.Process(); 
    _timer.Enabled = true; 

    // other code goes here 
} 

在我的例子中,計時器調用ScheduledTask.Process()每分鐘。這裏是我ScheduledTask類的樣子:

public class ScheduledTask { 

    public int Id { get; set; } 
    public DateTime Time { get; set; } 

    public static void Process() { 

     using (var db = new ApplicationDbContext()) { 
      db.ScheduledTasks.Add(new ScheduledTask { 
       Time = DateTime.Now 
      }); 
      db.SaveChanges(); 
     } 

    } 

} 

在步驟(),你可以做任何你想要的,但我只是在數據庫中創建一個條目,以測試是否有效。我會記住這任務大約一天工作,所以,你可以看到結果這裏:

http://contactmanager1.azurewebsites.net/ScheduledTask

更新

事實證明,這是不成立的最好方法計劃任務,因爲當應用程序池超時(由於站點活動較少)時,此計時器將死亡。當應用程序池再次啓動時,計時器會自動重新啓動,但對於小批量的站點,這不是一個可靠的解決方案。

+1

那麼應該很容易(如果不是完全乾淨的話)通過實現一個保持活躍的API來糾正,即每隔10分鐘左右就有一個單獨的計時器調用。這應該可以防止應用程序池超時。這是解決方案還是黑客? – havardhu

+0

這對任何大型網站都不是一個可靠的解決方案。如果您的應用程序很大,那麼您可能會運行多個應用程序實例,因此需要多個調度程序。這可能適用於在單個實例中使用率較低的小型應用程序,並且啓用了AlwaysOn功能以避免AppPool回收。 [我知道這個帖子很舊,只是爲了讓新手清楚] –