簡體   English   中英

Azure網站 - 計划任務

[英]Azure Web Sites - scheduled tasks

我正在開發一個我打算在Windows Azure上托管的網站。 該站點需要運行一些每日/每周預定作業,同步到各種第三方數據源,發送用戶通知等。它還應該能夠運行按需異步任務,例如向用戶發送電子郵件等。

我最初的想法是使用Azure雲服務來托管它,一個運行MVC 4的Web角色和一個輔助角色都負責計划任務,並將異步任務(發送電子郵件等)從隊列存儲中拉出來。 然而,這將花費我,看看我需要為計算時間支付雙倍的費用。

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

我可以通過將Azure網站用於MVC站點並讓工作人員角色運行這些成本來減少一半的成本,但我很想知道其他替代方案,除了從我的管理模塊手動觸發它們的明顯選項。

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

看起來Azure最終內置了適當的調度 - 請參閱Azure Scheduler文檔

雖然它處於預覽狀態,您現在很可能不得不使用REST API,但我確信它不會在管理門戶中提供功能之前很久。 我一直在等待這個年齡!

如果您願意在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隊列與工作者角色進行通信。 假設您在Extra Small VM大小中托管2個工作者角色實例,那么每月花費約30.00美元($ 0.02 x 2 x 750小時)。 我寫了一篇關於構建自己的任務調度程序的博客文章,並在不久前將其托管在一個輔助角色中。 你可以在這里閱讀那篇文章: http//gauravmantri.com/2013/01/23/building-a-simple-task-scheduler-in-windows-azure/

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

我不這么認為。 Windows Azure網站不提供SSL。 請在此處查看SSL定價: http//www.windowsazure.com/en-us/pricing/details/web-sites/

您可以使用Timer類在Azure Web站點項目中運行調度程序。 這樣,您可以將所有內容封裝在ASP.NET MVC項目中。

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

我在Azure網站上的MVC項目中對此進行了測試,並確認其有效。 要進行此設置,請在Global.asax.cs的Application_Start()內啟動計時器:

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();
        }

    }

}

在Process()中,你可以做任何你想做的事情,但我只是在數據庫中創建一個條目來測試它是否有效。 我會讓這項任務工作大約一天,所以你可以在這里看到結果:

http://contactmanager1.azurewebsites.net/ScheduledTask

更新

事實證明,這不是設置計划任務的最佳方式,因為此計時器在應用程序池超時時死亡(由於站點上的活動較少)。 當應用程序池再次啟動時,計時器會自動重新啟動,但對於低容量站點,這不是一個可靠的解決方案。

文章實現重復背景任務的危險在ASP.NET中有一個非常有趣的想法,即在您的Asp.Net應用程序中運行后台任務,而沒有AppDomain關閉停止任務的風險。

如果您不想為Azure輔助角色付費,可以嘗試一下。

我只需要先說你不需要支付雙倍:)

Azure PaaS(平台即服務)中的“WebRole”只是一個WorkerRole + IIS。

因此,由於您需要放入計時器的邏輯非常少,並且可能不會占用大量資源,因此您只需在“WebRole.cs”文件的OnStart中啟動后台工作線程即可在你的網絡應用程序內。

這將導致您的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();
        }
    }
}

嗨,我正在添加鏈接,因為微軟宣布他們已退出Azure上的預定部分。

https://azure.microsoft.com/en-us/updates/azure-scheduler-will-retire-on-september-30-2019/

https://support.microsoft.com/en-us/help/4316957/products-reaching-end-of-support-for-2019

要執行新的計划任務(或后端程序),您也要探索邏輯應用程序。

https://azure.microsoft.com/fr-fr/services/logic-apps/

https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-examples-and-scenarios

我希望盡快在博客上展示完整的示例代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM