我正在 Azure 上试验两种基于.NET Framework的可以定时器触发的机制:Azure Function v1和WebJob。AF 部署在 Function App 上,WebJob 部署在 Api App 上。两者都有免费计划集。
我希望通过 CRON 计划重复运行一些测试代码(控制台中的 1 行)(测试两者:“0 */10 * * * *”,每 10 分钟一次)将是一项简单的任务。看起来并非如此。
注意:在开始实验之前,我通过测试队列触发的 WebJob 已经知道应该将连续 WebJob 设置为“始终开启”以防止在一个小时左右后休眠。但这不能在免费和共享计划上启用。但是,在队列触发的 WebJob 上,我设法通过向应用程序发送经过身份验证的请求以在每次向队列中添加新消息时唤醒它来创建一种解决方法,这样我可以确保 WebJob 在它有时不处于休眠状态需要完成的一些工作,即要处理的队列消息。
但是我认为计时器触发的 WebJob 不应该是“连续的”,而应该是“触发的”。但是当我将它部署为“触发”时,我得到了这个错误:
(内部异常 #0)ExitCode:-1,输出:命令 'cmd /c ""HeartbeatW ...' 由于 121 秒内没有输出或 CPU 活动而中止。如果需要,您可以增加 SCM_COMMAND_IDLE_TIMEOUT 应用程序设置(或 WEBJOBS_IDLE_TIMEOUT,如果这是一个 WebJob)。
我不确定增加超时如何帮助解决这个问题以及应该设置哪个值,但我的主代码可能有问题:
static void Main()
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddTimers();
});
builder.ConfigureLogging((context, b) =>
{
b.AddConsole();
});
var host = builder.Build();
using (host)
{
host.Run();
}
}
将 WebJob 部署为“连续”而不是“触发”可防止此错误,但仍有 2 个问题:
- 部署后,我需要转到门户并选择“运行”以启动 WebJob - 我还没有发现这是否可以自动化,或者我是否必须切换到付费计划
- WebJob 在运行一个小时左右后进入睡眠状态(因为它在免费计划上运行并且不能设置为“始终开启”),这次我没有解决方法来唤醒它,因为没有手动操作涉及
进一步使用 Azure Function,情况会变得更糟。如果我部署我的函数,请稍等片刻,然后转到函数>监视器,我可以看到函数没有在它应该运行的时间段上运行。但是,如果我保持监视器视图打开,那么我可以看到函数现在已开始按计划运行!所以我猜想查看日志会触发函数唤醒,就像向应用程序发送经过身份验证的请求到 WebJob 一样。至少它会持续一个小时左右,因为在那之后功能日志不会显示新的运行。
我读过 Azure Function 和 WebJob 都在引擎盖下的同一个调度程序上运行。这是 Azure Function 出现这种行为的原因吗?
所有这些都是设计的,不能改变吗?还是我应该在部署过程中做一些调整?