Azure运行作业上的ASP.NET MVC“每小时”

问题描述 投票:0回答:1

我有一个ASP.NET MVC站点,我在Azure中运行。有一项工作我想每小时开始一次更新数据。

我目前每小时都有一个Azure作业设置来命中我的控制器/操作方法,该方法调用“数据加载”服务。

    public JsonResult Load()
    {
        Task.Factory.StartNew(() => DataService.LoadData());

        return Json(new { success = true }, JsonRequestBehavior.AllowGet);
    }

通过这种方式,它启动了流程并允许Azure作业“成功”

但是,这项工作现在正在运行它自己的线程,我认为这是不安全的。我将代码包装在try / catch中,有时我看到一个线程中止记录。如何在没有线程中止的情况下成功运行这个5-10分钟的数据加载?

此外,我只希望在5-10分钟的数据加载发生后1小时内再次运行作业。

因此,如果负载在上午8点开始并在8:10结束,我不希望下一次数据加载发生到8:11(依此类推)

显然我目前没有为此设置。从理论上讲,我可以设置一个工作来每分钟ping一次并查看它是否“运行时间”,但我不一定要这样做。

c# asp.net-mvc multithreading azure
1个回答
0
投票

正如评论中已经提到的那样,你最好将“长时间运行”的任务与你的网站分开,你仍然可以将它保存在相同的解决方案中,作为独立的项目,使共享业务逻辑代码更简单,只需部署到两种不同的环境 - 网站+ WebJob,网站+ WebWorker

您可以尝试缓解IIS上长时间运行的任务的问题,请参阅此处的一些资源:

如果没有上述保证您的任务/工作将完成,回收将无论如何都会杀死它。

如果您的“长时间运行”任务正在为MVC预加载数据,您仍然可以将其提取到单独的服务,并使您的数据可用于通过缓存(工作人员填充缓存),DocumentDB / SearchAPI(工作人员每小时预备一次),自托管API在WorkerRole中。

您可以在上一次完成Service Bus后一小时安排任务 - 通过向ScheduledEnqueueTimeUtc设置的队列添加消息 - 如果您的任务不是毫秒敏感的话,那就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.