【问题标题】:Azure Durable Function Invoke without HttpTrigger (Autostart)没有 HttpTrigger 的 Azure 持久函数调用(自动启动)
【发布时间】:2019-07-03 14:55:33
【问题描述】:

我正在查看此示例以在设置超时后运行持久函数 Activity。

https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-eternal-orchestrations

这将允许我的函数活动执行数据处理,然后等待 1 小时再尝试再次加载。这将永远持续运行。完美。

但是,在将函数发布到 Azure 时,我不想通过关联的 HTTP 触发器手动调用/启动函数。我只希望持久功能自动启动并开始处理。

这可能吗?如果没有,建议的解决方法是什么?

谢谢!

【问题讨论】:

  • 如果你有一个简单的客户端函数和一个定时器触发器来启动你的编排器,它会完成这项工作吗?
  • 否则,假设您使用的是 Azure DevOps,这可能是您发布管道的一部分。部署函数应用程序后,有一个任务会戳你的 HTTP 触发函数...?
  • 你说的只是一个自动启动的定时器触发功能,基本上只运行一次来​​启动他们的协调器吗?这可能吗?
  • 如果我理解正确,编排器需要由客户端函数启动。在您的情况下,我认为客户端功能可能是 HTTP 触发的客户端功能(又名踢球者)。发布管道可以调用 Kicker 函数。每次部署新版本的 Function App 时,都可以调用一个简单的 bash 脚本并调用您的 Kicker,这将启动您的 Orchestrator……这有意义吗?
  • 是的。尚未将此应用程序添加到管道中,但我明白你在说什么。感谢您的想法!

标签: azure azure-functions azure-durable-functions


【解决方案1】:

正如 cmets 中所讨论的,一种方法是在发布管道中添加一个新任务。

以下是我从您的问题中了解您的设置:

[FunctionName("ClientFunction")]
public static async Task<HttpResponseMessage> OnHttpTriggerAsync([HttpTrigger(AuthorizationLevel.Anonymous, "post")]
            HttpRequestMessage request, [OrchestrationClient] DurableOrchestrationClient starter, ILogger logger)
{
    // Triggers the orchestrator.
    string instanceId = await starter.StartNewAsync("OrchestratorFunction", null);

    return new HttpResponseMessage(HttpStatusCode.OK);
}


[FunctionName("OrchestratorFunction")]
public static async Task DoOrchestrationThingsAsync([OrchestrationTrigger] DurableOrchestrationContext context, ILogger logger)
{
    DateTime deadline = context.CurrentUtcDateTime.Add(TimeSpan.FromHours(1));
    await context.CreateTimer(deadline, CancellationToken.None);

    // Triggers some yout activity.
    await context.CallActivityAsync("ActivityFunction", null);
}

[FunctionName("ActivityFunction")]
public static Task DoAnAwesomeActivity([ActivityTrigger] DurableActivityContext context)
{
}

现在,每次部署新版本的 Function App 时,都需要运行协调器。但是,我认为它不能自行启动。

我的建议是有一个简单的 bash 脚本(使用 curl 或其他东西),它会在适当的 URL 调用 ClientFunction

最重要的是,此解决方案的优点之一是,如果 Azure Function 没有响应,您可能会导致部署失败。

【讨论】:

  • 我喜欢!无论如何,我需要将这些位移动到开发操作管道。谢谢!
【解决方案2】:

这似乎也有效。

[FunctionName("AutoStart")]
public static async Task Run([TimerTrigger("*/5 * * * * *", RunOnStartup = true, UseMonitor = false)]TimerInfo myStartTimer, 
    [DurableClient] IDurableClient orchestrationClient, ILogger log)
    {
        string instanceId = await orchestrationClient.StartNewAsync("Start_Orchestrator", null);
    }

【讨论】:

  • 不会每5分钟触发一次吗?如果我只想触发我的 [持久功能中的永恒编排][1] 怎么办。 [1]:docs.microsoft.com/en-us/azure/azure-functions/durable/…
  • @KrishnenduGhosh-MSFT 每 5 秒。 ;) 普通 Azure Function 只能同时运行一个 TimerTriggers 实例。这仅在等待 StartNewAsync 完成时才有效。但是可以暂停持久功能,所以我认为这不会正常工作(通过我不知道)。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多