【问题标题】:Fire-and-forget background jobs using Azure Durable Functions使用 Azure Durable Functions 的即发即弃后台作业
【发布时间】:2022-02-18 02:20:28
【问题描述】:

我有一个用例要求我在不关心其结果的情况下触发一些 Azure Durable Functions,我想知道我的方法是否正确。

这是我所处的场景:

  • 函数A 使用HttpTrigger
  • 函数B 使用ActivityTrigger

这是我的工作流程:

  • A被调用,需要做一些业务逻辑
  • 除了这个业务逻辑之外,我还需要执行一个可能会失败也可能不会失败的长时间后台任务。我不关心结果,但每次调用 A 时我都需要运行此任务。
  • A 需要尽快返回,所以我等不及后台任务完成
  • B 负责这个后台任务,而 A 返回

我在网上找到的所有 Durable Functions 示例都显示如下:

await starter.StartNewAsync("BackgroundDurableFunction", data)

我的问题是我不想await 持久功能,但我需要它在后台运行并做它的事情(主要是网络 I/O)。

为了避免等待这个持久功能,我最终采用了这个解决方法:

Task.Factory.StartNew(() => starter.StartNewAsync("BackgroundDurableFunction", data));

这似乎工作得恰到好处,因为我不需要 await 任何东西,但在阅读 The Dangers of Task.Factory.StartNew 之后,我有点害怕这可能是一个危险的解决方案。

所以,问题是:什么是启动持久函数并让它在后台运行而不关心其结果(并且没有关于不等待任务的警告)的正确方法?

【问题讨论】:

    标签: c# azure-functions azure-durable-functions


    【解决方案1】:

    是的,持久函数应该适用于您的场景。您只是缺少一件事:Orchestrator。这应该可以帮助您开始:

    [FunctionName("MyHttpTriggered")]
    public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log,
    [OrchestrationClient] DurableOrchestrationClient starter)
    {
        string data = "hello";
        string instanceId = await starter.StartNewAsync("MyOrchestrator", data);
        return new OkObjectResult($"Orchestrator started. Instance ID={instanceId}");
    }
    
    [FunctionName("MyOrchestrator")]
    public static async Task MyOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)
    {
        string data = context.GetInput<string>();
        await context.CallActivityAsync("YourActivityFunction", data);
    }
    
    [FunctionName("YourActivityFunction")]
    public static async Task YourActivityFunction([ActivityTrigger] string data, ILogger log)
    {
    
        // do whatever here
    
    }
    

    虽然有await 声明,但这确实是一劳永逸。相反的是fan-in 模式。在这种情况下,您基本上是在没有扇入的情况下进行扇出。

    【讨论】:

    • 其实BackgroundDurableFunction是我的编排,抱歉没说清楚。我不太清楚你的意思:你是说尽管await 在那里,starter.StartNewAsync 只是触发函数而不等待其结果?
    • 是的,因为 StartNewAsync 不会产生任何结果 - 除了实例 ID。在此处查看我的完整示例,其中包含 github.com/sebader/alpinehutproject/blob/master/AzureFunctions/…
    • 试一试;)
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    相关资源
    最近更新 更多