Azure functions 是否可以在随机计划中触发azure函数?
我正在创建一个Azure函数,希望它在每次运行之间有一个随机延迟。我希望每次跑步之间的延迟从10-20分钟的间隔中随机选择。例如,我想要: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
- 函数运行
- 延迟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
}