我想在定时器上调用一个函数(每隔X分钟),但我想确保一次只运行此函数的一个实例。函数中发生的工作不会花费很长时间,但如果由于某种原因它需要比计划的计时器(X分钟)更长的时间,我不希望另一个实例启动,并且每个实例都要执行其他。
我能想到的最简单的方法是将函数的最大执行时间设置为X分钟。我想知道如何在App Service和Consumer计划中实现这一点,即使它们是不同的方法。我还希望能够在单个功能级别上设置它。
这种类型的功能通常内置于FaaS环境中,但我最困难的时候是google-binging它。这可能在function.json中吗?或者也有不同的方法来确保它只运行一次?
(PS。我知道我可以在我自己的代码中通过将工作包装在一个超时的线程中来实现。但我希望有一些更惯用的东西。)
答案 0 :(得分:2)
您可以指定' functionTimeout' host.json中的属性 https://github.com/Azure/azure-webjobs-sdk-script/wiki/host.json
// Value indicating the timeout duration for all functions.
// In Dynamic SKUs, the valid range is from 1 second to 10 minutes and the default value is 5 minutes.
// In Paid SKUs there is no limit and the default value is null (indicating no timeut).
"functionTimeout": "00:05:00"
答案 1 :(得分:1)
计时器功能已经具有此行为 - 它们从AzureWebJobsStorage
存储帐户中取出blob租约,以确保只有一个实例正在执行计时器功能。此外,在先前的计划执行正在进行中时,计时器将不会执行。
另一种滚动方式是使用存储队列和可见性超时来处理这种情况 - 当队列处理完毕后,推送一个具有可见性超时的新队列消息以匹配所需的时间表。
我想提一下functionTimeout
host.json
属性会为你的所有函数添加一个超时,但是副作用是你的函数会因超时错误而失败并且该函数实例将重启,所以在这种情况下我不会依赖它。
答案 2 :(得分:1)
有一个名为Premium的新Azure Functions计划(自2019年5月起在公共预览版),该计划允许无限执行时间: https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale
对于大多数企业方案而言,它可能最终会成为goto计划。