我有一个用例,要求我启动一些 Azure Durable Functions,而不关心其结果,我想知道我的方法是否正确。
这是我所处的场景:
- 功能
A
使用一个HttpTrigger
- 功能
B
使用一个ActivityTrigger
这是我的工作流程:
-
A
被调用,需要做一些业务逻辑
- 除了这个业务逻辑之外,我还需要执行一项可能失败也可能不会失败的长时间后台任务。我不关心结果,但我需要每次都运行这个任务
A
被调用。
-
A
需要尽快返回,这就是为什么我等不及后台任务完成
-
B
处理这个后台任务,同时A
returns
我在网上找到的所有耐用功能示例都显示如下:
await starter.StartNewAsync("BackgroundDurableFunction", data)
我的问题是我不想await
持久功能,但我需要它在后台运行并执行其操作(主要是网络 I/O)。
为了避免等待这个持久功能,我最终采用了以下解决方法:
Task.Factory.StartNew(() => starter.StartNewAsync("BackgroundDurableFunction", data));
这似乎工作得很好,因为我不需要await
任何事情,但读完之后Task.Factory.StartNew 的危险 https://sergeyteplyakov.github.io/Blog/async/2019/05/21/The-Dangers-of-Task.Factory.StartNew.html我有点害怕这可能是一个危险的解决方案。
所以,问题是:启动持久功能并让它在后台运行而不关心其结果(并且没有关于不等待任务的警告)的正确方法是什么?
是的,持久函数应该适合您的场景。你只是缺少一件事:协调器。这应该可以帮助您开始:
[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 https://learn.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-cloud-backup#the-functions图案。在这种情况下,您基本上只进行扇出而不进行扇入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)