繁体   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