我正在创建一个Azure函数,并且希望它在每次运行之间随机延迟地运行。我希望每次运行之间的延迟是从10到20分钟的间隔中随机选择的。例如,我想要:
这可能吗?谢谢。
答案 0 :(得分:1)
使用CreateTimer
方法的持久功能是可能的。
示例:
public static async Task Run(DurableOrchestrationContext ctx)
{
//Do some work here
while (true)
{
// Orchestration will sleep until this time
var nextCheck = ctx.CurrentUtcDateTime.AddSeconds(randomNumber);
await ctx.CreateTimer(nextCheck, CancellationToken.None);
//Call the function again
}
}
您可以在这里Azure Durable Functions
了解更多信息答案 1 :(得分:1)
functions.json
请勿按照建议修改functions.json
。它会重新启动整个功能应用程序,以我为例(使用Node.js),这还意味着我需要为读取/写入node_modules
文件夹中的数万个文件支付少量但可观的费用。< / p>
您最好的选择是每分钟运行一次该功能,但大多数情况下立即退出。这是一个例子。我假设我们想随机运行该函数,但是平均而言,我们希望每15分钟运行一次函数。
// On average, run the function every N minutes:
const AVERAGE_RUN_EVERY=15;
if (Math.random() > 1 / AVERAGE_RUN_EVERY) {
// Most of the time, we will exit here:
context.done();
} else {
// Your actual code here
}
int AVERAGE_RUN_EVERY = 15;
Random rnd = new Random();
if (rnd.Next(0, AVERAGE_RUN_EVERY) == 0) {
// Your actual code here
}
假设每次执行的最低费用为100ms,而应用程序使用的内存为256 MB或更少,则每月您将收取费用:
0.1s * 0.25 GB * 1440分钟/天* 30天* $ 0.000016 / GB / s = 0.02 USD
实际上,您甚至可能省钱,因为如果功能应用程序每分钟运行一次,它将不会进入睡眠模式,这意味着该功能将花费更少的启动时间。
答案 2 :(得分:1)
耐用功能是要走的路。但是,您可以在 ContinueAsNew()
中使用 IDurableOrchestrationContext
方法,而不是使用循环。这将使编排重新开始,从而防止您的编排历史表因使用简单循环而变得过长。
此外,编排器需要具有确定性,因此您不应在编排器中使用随机数生成器或调用 DateTime.Now
。
[FunctionName("Orchestrator")]
public static async Task RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
int delay = await context.CallActivityAsync<int>("Activity", null);
await context.CreateTimer(context.CurrentUtcDateTime.AddMinutes(delay), CancellationToken.None);
context.ContinueAsNew(null);
}
[FunctionName("Activity")]
public static int DoActivity([ActivityTrigger] object input, ILogger log)
{
// Do whatever you want to do at random intervals.
return new Random((int)DateTime.Now.Ticks).Next(1, 60);
}
顺便说一下,由于持久编排的工作原理,当您等待在编排器中创建的计时器时,实际上并没有运行任何功能,因此不会在延迟期间向您收费。不过,您仍然需要为花在客户端和活动功能上的等待时间付费。
更多信息:
https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-orchestrations
https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-code-constraints
https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-eternal-orchestrations