是否可以随机安排触发天蓝色功能?

时间:2018-08-15 03:42:01

标签: azure-functions

我正在创建一个Azure函数,并且希望它在每次运行之间随机延迟地运行。我希望每次运行之间的延迟是从10到20分钟的间隔中随机选择的。例如,我想要:

  • 功能运行
  • 延迟11分钟
  • 功能运行
  • 延迟17分钟
  • 功能运行
  • 延迟10分钟
  • 功能运行
  • 延迟20分钟
  • 等...

这可能吗?谢谢。

3 个答案:

答案 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分钟运行一次函数。

Node.js

// 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
}

.NET

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