Azure Functions:计时器触发器和消耗计划问题

Enr*_*ico 5 c# azure azure-functions

在我的开发环境中,我有一个包含 21 个函数的 Azure Functions,应用程序计划是消费。

一些函数有一个定时器触发器,在过程结束时每个函数都会发送一封电子邮件。我有两种类型的定时器触发器:

  • 每 20 分钟运行一次函数
  • 在晚上的特定时间运行一次函数

每 20 分钟,该函数就会按照我的预期执行。伟大的。

我面临的问题是他们必须在特定时间启动的功能。基本上,直到我打开门户并在 Azure Function 上执行某些操作(例如打开其中一个的监视器)后,它们才会启动。

从代码的角度来看,所有带有定时器触发器的函数都是这样定义的:

[FunctionName("invoiceMonthlyGeneratorTimer")]
public void Run([TimerTrigger("%Timers:GenerateMonthlyInvoices%")] TimerInfo myTimer)
{
    // ..
}

[FunctionName("invoiceDunningTimer")]
public async Task Run([TimerTrigger("%Timers:DunningTimer%")] TimerInfo timer)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

定时器的配置在设置文件中,如:

"Timers": {
    "DunningTimer": "0 0 4 * * *",
    "GenerateMonthlyInvoices": "0 0 4 * * *"
}
Run Code Online (Sandbox Code Playgroud)

一般来说,这种方法适用于开发环境,并且在生产环境中运行良好。

因为每个函数都会发送一封电子邮件,所以我希望每天早上都能在我的收件箱中找到一些电子邮件,但这并没有发生。然后,我打开 Azure 门户查看日志和监视器。

在门户中打开 Azure 功能。

在此处输入图片说明

打开一个函数的监视器

在此处输入图片说明

瞧,几秒钟后,我开始收到所有服务的电子邮件!在生产环境中,我没有在 dev 中拥有的所有功能,因为我想在部署之前进行测试。在 prod 中,功能运行良好,并在正确的时间启动。

如果我查看 Application Insights,我只能找到打开监视器时的日志。

在此处输入图片说明

日志中有一件有趣的事情:

触发详情:UnscheduledInvocationReason:IsPastDue,OriginalSchedule:2020-07-24T05:00:00.0000000+00:00

在此处输入图片说明

更新

显然,在同一个 Azure Functions 中不能有多个计时器触发器。我在Github上打开了一个问题,所以如果其他开发人员面临同样的问题。类似于 HTTP 触发器的东西,看看这篇文章

Fra*_*age 0

您的函数应用程序中的函数太多,它们可能会相互交互。我遇到了类似的问题,在这种情况下,计时器触发器在一个功能应用程序中起作用并且不起作用。但是当我将它们部署到不同的功能应用程序时,它们工作得很好。因此您可以尝试将第二个函数部署到另一个函数应用程序。

而且我建议你将这个问题报告给微软,他们可以了解更多关于这个问题的信息,并且可能有更好的解决方案。