Azure functions 是否可以在随机计划中触发azure函数?

Azure functions 是否可以在随机计划中触发azure函数?,azure-functions,Azure Functions,我正在创建一个Azure函数,希望它在每次运行之间有一个随机延迟。我希望每次跑步之间的延迟从10-20分钟的间隔中随机选择。例如,我想要: 函数运行 延迟11分钟 函数运行 延迟17分钟 函数运行 延迟10分钟 函数运行 延迟20分钟 等等 这可能吗?谢谢。使用CreateTimer方法可以实现持久功能 例如: public static async Task Run(DurableOrchestrationContext ctx) { //Do some work here

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

  • 函数运行
  • 延迟11分钟
  • 函数运行
  • 延迟17分钟
  • 函数运行
  • 延迟10分钟
  • 函数运行
  • 延迟20分钟
  • 等等

这可能吗?谢谢。

使用
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


    } 
}

您可以在此处阅读更多信息

使用
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


    } 
}
您可以在此处了解更多信息

请勿修改
函数。json
不要按照建议修改
functions.json
。它会重新启动您的整个功能应用程序,在我的情况下(使用Node.js),这也意味着我在
Node\u modules
文件夹中读/写数万个文件会收到一笔小额但明显的费用

解决方案 最好的办法是每分钟运行一次函数,但大部分时间都会立即退出。这里有一个例子。我假设我们想随机运行函数,但平均每15分钟运行一次函数

Node.js 网 随机跑步的额外费用 假设每次执行的最低费用为100ms,且应用程序使用的内存为256MB或更少,则每个月您将收取以下费用:

0.1s*0.25GB*1440分钟/天*30天*0.000016美元/GB/s=0.02美元

事实上,你甚至可能会省钱,因为如果你的函数应用程序每分钟运行一次,它就不会进入睡眠模式,这意味着该函数将花费更少的启动时间。

不要修改
函数。json
不要按照建议修改
functions.json
。它会重新启动您的整个功能应用程序,在我的情况下(使用Node.js),这也意味着我在
Node\u modules
文件夹中读/写数万个文件会收到一笔小额但明显的费用

解决方案 最好的办法是每分钟运行一次函数,但大部分时间都会立即退出。这里有一个例子。我假设我们想随机运行函数,但平均每15分钟运行一次函数

Node.js 网 随机跑步的额外费用 假设每次执行的最低费用为100ms,且应用程序使用的内存为256MB或更少,则每个月您将收取以下费用:

0.1s*0.25GB*1440分钟/天*30天*0.000016美元/GB/s=0.02美元


事实上,你甚至可以省钱,因为如果你的功能应用程序每分钟运行一次,它就不会进入睡眠模式,这意味着该功能启动所花费的时间会更少。

持久功能是一条路要走。但是,您可以在
IDurableCorchestrationContext
中使用
ContinueAsNew()
方法,而不是使用循环。这将使业务流程重新开始,从而防止业务流程历史记录表因使用简单循环而变得过长

此外,orchestrator需要具有确定性,因此您不应该在orchestrator中使用随机数生成器或调用
DateTime.Now

[FunctionName(“Orchestrator”)]
公共静态异步任务RunOrchestrator([OrchestrationTrigger]IDurableCorchestrationContext)
{
int delay=await context.CallActivityAsync(“活动”,null);
wait context.CreateTimer(context.CurrentUtcDateTime.AddMinutes(delay),CancellationToken.None);
context.ContinueAsNew(null);
}
[功能名称(“活动”)]
公共静态int-DoActivity([ActivityTrigger]对象输入,ILogger日志)
{
//以随机间隔做你想做的任何事情。
返回新的随机((int)DateTime.Now.Ticks).Next(1,60);
}
顺便说一句,由于持久编排的工作方式,当您等待在编排器中创建的计时器时,实际上没有运行任何函数,因此在延迟期间不会向您收费。不过,您仍然需要支付在客户端和活动功能中花费的等待时间

更多信息:



持久功能是一条路要走。但是,您可以在
IDurableCorchestrationContext
中使用
ContinueAsNew()
方法,而不是使用循环。这将使业务流程重新开始,从而防止业务流程历史记录表因使用简单循环而变得过长

此外,orchestrator需要具有确定性,因此您不应该在orchestrator中使用随机数生成器或调用
DateTime.Now

[FunctionName(“Orchestrator”)]
公共静态异步任务RunOrchestrator([OrchestrationTrigger]IDurableCorchestrationContext)
{
int delay=await context.CallActivityAsync(“活动”,null);
wait context.CreateTimer(context.CurrentUtcDateTime.AddMinutes(delay),CancellationToken.None);
context.ContinueAsNew(null);
}
[功能名称(“活动”)]
公共静态int-DoActivity([ActivityTrigger]对象输入,ILogger日志)
{
//以随机间隔做你想做的任何事情。
返回新的随机((int)DateTime.Now.Ticks).Next(1,60);
}
顺便说一句,由于持久编排的工作方式,当您等待在编排器中创建的计时器时,实际上没有运行任何函数,因此在延迟期间不会向您收费。不过,您仍然需要支付在客户端和活动功能中花费的等待时间

更多信息:



如果你对一些真正骇客的方法持开放态度,这似乎是相关的。此人重写他们的
function.json
文件,以将现有的
计划
替换为随机计划。否则,如果你有办法存储一个持久值(本地或DB),你可以选择一个10到20之间的随机数,加上那么多分钟
int AVERAGE_RUN_EVERY = 15;
Random rnd = new Random();
if (rnd.Next(0, AVERAGE_RUN_EVERY) == 0) {
  // Your actual code here
}