【问题标题】:ASP.NET MVC on Azure Run Job "Every Hour"Azure 上的 ASP.NET MVC“每小时”运行作业
【发布时间】:2014-11-18 14:59:49
【问题描述】:

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

我目前有一个每小时一次的 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 一次,看看它是否是“运行时间”,但我不一定想这样做。

【问题讨论】:

  • 您使用的是网络和辅助角色还是网站?如果使用角色,为什么不创建工作者角色的 XS 实例来进行后台处理?
  • 我没有使用辅助角色。只需使用我正在与调度程序 ping 的“网站”。我看到的工人角色的问题是它必须在我当前的 MVC 解决方案之外生活
  • 是的,但是如果您的业务/数据库逻辑在您的解决方案中的自己的项目中,那么一个简单的参考将为您提供相同的逻辑/代码。只是我的 2cents 作为主要工人角色的原因之一是运行循环代码。网站通常很糟糕(应用程序池回收/网络应用程序进入睡眠的频率等)
  • 使用 Azure 函数。这就是它的目的。这非常棒。 docs.microsoft.com/en-us/azure/azure-functions/…

标签: c# asp.net-mvc multithreading azure


【解决方案1】:

正如 cmets 中已经提到的,您最好将“长时间运行”的任务从您的网站中分离出来,您仍然可以将其作为单独的项目保留在相同的解决方案中,以使共享业务逻辑代码更简单和只需部署到两个不同的环境 - 网站 + WebJob、网站 + WebWorker

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

以上都不能保证你的任务/工作会完成,无论如何回收都会杀死它。

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

您可以在上次使用服务总线完成后一小时安排您的任务 - 通过将消息添加到设置了 ScheduledEnqueueTimeUtc 的队列 - 如果您的任务不是毫秒敏感的,这应该足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2012-07-18
    • 2019-11-19
    • 2022-01-03
    相关资源
    最近更新 更多