Azure Web Sites - 定时任务

10

我正在开发一个网站,计划将其托管在Windows Azure上。该网站需要运行一些每日/每周定时任务,同步到各种第三方数据源,发送用户通知等。它还应该能够运行按需异步任务,例如向用户发送电子邮件等。

我的最初想法是使用Azure Cloud Services进行托管,其中一个Web角色运行MVC 4,另一个Worker角色负责处理定期任务,并从队列存储中拉取异步任务(发送电子邮件等)。然而,这会花费我很多成本,因为我需要支付两倍的计算小时数。

这个项目可能会在未来证明这个成本是有价值的,但在业务增长之前,我真的希望找到更便宜的选择。因此,我正在研究Azure Web Sites。

我可以通过使用Azure Web Sites来减少一半的成本,用Worker角色运行任务,并且让MVC站点运行在Azure Web Sites上,但我想了解其他替代方案,除了显然的选项就是手动从我的管理员模块触发任务。

此外,我是否能够连接我的域名并在Azure Web Sites上免费使用SSL?

7个回答

5

看起来Azure终于有了合适的调度功能- 请查看Azure Scheduler文档

虽然目前处于预览阶段,您大多数情况下需要使用REST API,但我相信不久后这个功能就会在管理门户中提供。我已经等了很长时间了!


您还可以通过管理库在常规.NET中使用它:http://fabriccontroller.net/blog/posts/a-complete-overview-to-get-started-with-the-windows-azure-scheduler/ - Sandrino Di Mattia
谢谢,看起来很有趣。它似乎比运行完整的后台工作程序更便宜。 - havardhu
Azure Scheduler是否广泛可用?我在我的门户中没有看到它。 - Johnny Oshika

3
如果您熟悉Node.js编写代码,可以看看Windows Azure移动服务。它具有定义和执行计划任务的功能。更多信息请参见此处:http://www.windowsazure.com/en-us/develop/mobile/tutorials/schedule-backend-tasks/
另一个选择是使用Aditi的调度程序服务:http://www.aditicloud.com/
还有一种选择是编写自己的调度程序并在Azure网站中托管该解决方案。我建议使用Quartz.net调度库。它是免费的、开源的,并被许多人使用。
我仍然认为通过Worker Role处理作业是可行的解决方案。您可以将前端基础架构托管在Windows Azure网站中,并通过Windows Azure队列与工作角色通信。假设您在Extra Small虚拟机大小中托管了2个实例的工作角色,每月成本约为30.00美元(0.02 x 2 x 750小时)。我不久前写了一篇关于如何构建自己的任务调度程序并在工作角色中托管它的博客文章。您可以在此处阅读该文章:http://gauravmantri.com/2013/01/23/building-a-simple-task-scheduler-in-windows-azure/

另外,我能连接网站到我的域名并免费使用SSL吗?

我不认为可以。Windows Azure网站中的SSL不是免费的。请在此处查看SSL定价:http://www.windowsazure.com/en-us/pricing/details/web-sites/

Windows Azure 移动服务目前支持的库列表非常有限,因此在计划任务中可执行的操作也很少。 - David Burg

2
您可以使用Timer类在Azure Web Site项目中运行调度程序。这样,您就可以将所有内容封装在ASP.NET MVC项目中。
关于Timer类的信息:http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx 我在Azure Web Site上的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

更新:
原来这不是设置定时任务的最佳方法,因为当应用程序池因网站活动量低而超时时,此计时器会停止。当应用程序池重新启动时,计时器会自动重新启动,但对于低流量站点,这不是一个可靠的解决方案。

1
这应该很容易(如果不是完全干净的话)通过实现一个保持连接的API来进行修正,由一个单独的定时器每隔10分钟调用一次。这应该可以防止应用程序池超时。这是一个解决方案还是一个hack? - havardhu
这不是任何高流量网站的可靠解决方案。如果您的应用程序很大,您可能有多个应用程序实例在运行,因此有多个调度程序。这可能适用于单个实例中低使用率的小型应用程序,并启用AlwaysOn功能以避免AppPool回收。【我知道这篇文章已经过时了,只是为了让新手清楚】 - Diego Mendes

2

0

首先,我必须说您关于需要支付双倍是错误的 :)

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

因此,由于您需要放入计时器的逻辑非常简单,而且可能不会占用太多资源,因此您可以在Web应用程序内部的“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();
        }
    }
}

我按照https://azure.microsoft.com/en-in/documentation/articles/scheduler-get-started-portal/上的说明创建了一个演示。但是我怎么知道这个任务是否运行了? - Learning-Overthinker-Confused

0

这篇文章在ASP.NET中实现定期后台任务的危险性提出了一个非常有趣的想法,可以让后台任务在您的Asp.Net应用程序中运行,而不会因为AppDomain关闭而停止任务。

如果您不想支付Azure工作角色的费用,可以尝试它。


0

你好,我添加这些链接是因为微软宣布他们将退役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://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-examples-and-scenarios

我打算很快在博客上展示完整的样例代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接