【问题标题】:Azure Functions with timer trigger: UnscheduledInvocationReason带有计时器触发器的 Azure Functions:UnscheduledInvocationReason
【发布时间】:2020-07-27 13:06:27
【问题描述】:

在我的 Azure Functions 中,我有 26 个函数,只有 7 个带有计时器触发器(请参阅我的 previous post,我也看到了这个 other post,但它已经很旧了)。微软对此没有任何建议。一些函数有一个计时器触发器,并且在进程结束时每个函数都会发送一封电子邮件。我有 2 种类型的计时器触发器:

  • 每 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)
{
    // ...
}

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

"Timers": {
    "DunningTimer": "0 0 4 * * *",
    "GenerateMonthlyInvoices": "0 0 4 * * *"
}

惊讶于我早上没有收到任何电子邮件,我检查了 Application Insights 并没有找到任何与计时器功能相关的日志。

然后,我在门户中打开 Azure Functions,单击一个功能,然后神奇地收到了电子邮件。在日志中,我发现了类似以下的相同日志:

触发器详细信息:UnscheduledInvocationReason:IsPastDue,OriginalSchedule:2020-07-24T05:00:00.0000000+00:00

正如一个小伙子在我上一篇文章的评论中所建议的那样,定时器触发函数会发生冲突并且不会启动。这似乎很烦人。我还在Github 上打开了一个问题。

Azure Functions 中的计时器触发函数是否有任何类型的指南?有没有人和我遇到过同样的问题?

【问题讨论】:

标签: azure timer azure-functions


【解决方案1】:

对于这个问题,我认为它可能是由于您之前的帖子中提到的一个功能应用中的多个功能造成的。我在一个函数应用程序中遇到了与 http 触发功能和计时器触发功能类似的问题。代码很简单(我确认代码没有错误),但是定时器触发功能不能按时触发。

Here 是我遇到的类似问题的帖子。解决方法是在不同的函数应用程序中创建函数。对于您的问题,我认为您可以像我上面提到的那样在不同的功能应用程序中创建功能,或者您可以按照page 上的步骤在 azure 门户上提出支持票。 azure 支持团队会在这方面为您提供帮助,因为他们可以查看您的函数的更多日志详细信息。我认为在堆栈溢出社区中很难获得您想要的帮助。

【讨论】:

  • 根据您的经验,我们可以在 Azure Functions 中拥有多少个函数?对此没有指导方针。我在某处看到微软说你可以拥有尽可能多的功能
  • 我在 Github 上开了一个 issue,如果其他开发者有同样的问题github.com/Azure/Azure-Functions/issues/1666
  • @Enrico 是的,微软说我们可以在一个功能应用程序中拥有任意数量的功能。但是根据一些测试,如果我们在一个函数应用中使用多个http触发和定时器触发功能,可能会影响定时器触发,无法按时触发。一个函数应用中有多少个函数并不重要,我只是说如果一个函数应用中存在多个http触发器和计时器触发器可能会导致问题。
  • @Enrico 我可以知道您的函数应用程序使用了哪个计划吗?如果使用消费,请您尝试更改为更高的计划。
  • 是的,这是dev中的消费计划,而不是prod。
【解决方案2】:

如果它在应用服务计划中,您需要确保启用始终开启。功能应用上默认启用,但最好仔细检查。

消费模式中,没有 Always On 之类的东西。相反,您的 Function App 应该在计时器到期时自动唤醒。为此,您的触发器需要“同步”。

请参阅此article,了解有关对计时器触发函数应用进行故障排除的更多详细信息。

【讨论】:

  • Enrico,这是否意味着“同步触发器”确实解决了这个问题。如果是,则此问题更多是部署问题。当我使用 VS Code 部署函数时,我记得有一条“同步触发器”日志行。在那个 SO 问题出现之前,您是如何进行部署的?您最终对“同步触发器”应用了哪些更改?
猜你喜欢
  • 2021-12-22
  • 2021-01-17
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
相关资源
最近更新 更多