运行后台任务时防止 IIS 空闲超时

Posted

技术标签:

【中文标题】运行后台任务时防止 IIS 空闲超时【英文标题】:Prevent IIS from Idle Timeout when Running Background Tasks 【发布时间】:2020-05-13 14:52:32 【问题描述】:

在我们的 ASP.Net Core Web API 中,我们使用了Hosted Services 来执行一些后台任务。有时这些后台任务可能需要很长时间才能完成(大约一个小时)。除非有长时间运行的任务,否则一切都可以无缝运行。

IIS 应用程序池的空闲超时默认值为 20 分钟。因此,当 20 分钟没有请求时,IIS 会重新启动应用程序池。但有时后台任务可能正在运行并且 IIS 重新启动而不管它是否导致任务突然终止而没有将其标记为完成。 IIS 启动后,托管服务启动处理再次拾取任务。但在完成之前,IIS 会重新启动,这可能会一直持续下去。当存在可能多次发送同一电子邮件的电子邮件发送任务时,这可能会导致很多问题。

由于托管服务是 ASP.NET Core 的一等公民,如果 IIS 在执行空闲超时时也考虑后台执行,那将是理想的选择。

现在我们通过将 Idle Timeout 设置为 0 来解决这个问题,这样它就不会超时。这是一种 hacky 解决方案。此外,在动态添加和删除节点的负载平衡环境中,这不是一个可行的选择。

有没有更好的方法来“防止 IIS 在后台执行过程中重新启动”?

谢谢

【问题讨论】:

查看issue 您可以尝试一些设置,例如禁用空闲超时(设置为 0)、禁用常规时间间隔、将限制 CPU 间隔设置为 0 检查此图像以供参考:image 谢谢。这就是我现在所做的。但这不是一个合适的解决方案。 此 IIS 设置运行设置 IIS 应用程序池始终运行。 【参考方案1】:

我不知道你的设置,但也许你省略了 IIS 并使用了诸如 Kestrel 之类的东西。

另外,我不会将运行时间很长的任务(例如发送电子邮件)放在 IIS 进程中运行。而是将其放在另一个进程中,例如控制台应用程序,并让 apsnetcore 应用程序为用户提供请求。

【讨论】:

【参考方案2】:

考虑使用专为此类任务设计的Hangfire。目前,您可以将 IIS 配置为始终运行该站点。

    右键单击站点名称 > 管理网站 > 前进 > 确保预加载设置为 true。

    右键单击应用程序池 > 高级设置 > 空闲超时(分钟)为 0,启动模式为始终运行。

【讨论】:

以上是关于运行后台任务时防止 IIS 空闲超时的主要内容,如果未能解决你的问题,请参考以下文章

上传大型视频iOS时延长后台任务超时时间[关闭]

Android - 按请求顺序在后台运行任务

如何防止共享主机上的 IIS 应用程序池中的空闲超时

IIS 上任务的可靠后台队列

IIS后台进程

Django后台任务等待结果