[英]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
更新
事实证明,这不是设置计划任务的最佳方式,因为此计时器在应用程序池超时时死亡(由于站点上的活动较少)。 当应用程序池再次启动时,计时器会自动重新启动,但对于低容量站点,这不是一个可靠的解决方案。
Azure网站现在支持Azure WebJobs - http://www.hanselman.com/blog/IntroducingWindowsAzureWebJobs.aspx
文章实现重复背景任务的危险在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.