10

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

我最初的想法是使用 Azure 云服务来托管它,一个运行 MVC 4 的 Web 角色和一个工作角色既负责计划任务,又将异步任务(发送电子邮件等)从队列存储中拉出。但是,这会让我付出代价,因为我需要为计算时间支付双倍的费用。

该项目可能会在未来证明这一成本是合理的,但在业务回升之前,我真的更喜欢更便宜的替代方案。因此,我正在研究 Azure 网站。

通过将 Azure 网站用于 MVC 站点并让工作人员角色运行任务,我可以将成本降低一半,但我很想听听其他替代方案,除了从我的管理模块手动触发它们的明显选项。

另外,我可以将站点连接到我的域并使用 Azure 网站免费使用 ssl 吗?

4

7 回答 7

5

看起来 Azure 终于内置了适当的调度 -请参阅 Azure 调度程序文档

虽然它是预览版,而且您现在很可能必须使用 REST API,但我相信用不了多久,该功能就会在管理门户中可用。我一直在等待这个!

于 2013-11-07T08:12:25.230 回答
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 调度库。它是免费的、开源的并且被许多人使用。

我仍然认为采用 Worker Role 路线进行工作处理是一个可行的解决方案。您可以做的是在 Windows Azure 网站中托管前端基础结构,并通过 Windows Azure 队列与工作角色进行通信。假设您在超小型 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 吗?

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

于 2013-07-06T13:38:56.793 回答
2

Azure 网站现在支持 Azure WebJobs - http://www.hanselman.com/blog/IntroducingWindowsAzureWebJobs.aspx

于 2014-04-12T20:18:03.720 回答
2

您可以使用 Timer 类在 Azure 网站项目中运行调度程序。这样,您可以将所有内容封装在您的 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

更新

事实证明,这不是设置计划任务的最佳方式,因为当应用程序池超时(由于站点上的活动不足)时,此计时器会终止。当应用程序池再次启动时,计时器会自动再次启动,但对于低容量站点,这不是一个可靠的解决方案。

于 2013-11-22T16:30:32.860 回答
0

一开始我只需要说你需要支付双倍的费用是不正确的:)

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();
        }
    }
}
于 2013-07-13T21:24:32.950 回答
0

文章The Dangers of Implementing Recurring Background Tasks In ASP.NET有一个非常有趣的想法,即让后台任务在您的 Asp.Net 应用程序中运行,而不会有 AppDomain 关闭停止任务的风险。

如果您不想为 Azure 辅助角色付费,可以尝试一下。

于 2013-07-13T18:36:11.590 回答
0

嗨,我正在添加这些链接,因为 Microsoft 宣布他们将停用 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

我希望很快在博客上展示一个完整的示例代码。

于 2019-01-15T22:08:01.990 回答