首页 > 解决方案 > 从数据库中的数据运行大量活动函数

问题描述

我们有一个数据库,需要计算大约 400k 个元素。下面显示了一个协调器函数的示例。

[FunctionName("Crawl")]
public static async Task<List<string>> RunOrchestrator(
[OrchestrationTrigger] DurableOrchestrationContext context)
{
   if (!context.IsReplaying)
   {
   }

   WriteLine("In orchistration");
   var outputs = new List<string>();

   var tasks = new Task<string>[3];

   var retryOptions = new RetryOptions(
       firstRetryInterval: TimeSpan.FromSeconds(60),
       maxNumberOfAttempts: 3);

   // Replace "hello" with the name of your Durable Activity Function.
   tasks[0] = context.CallActivityWithRetryAsync<string>("Crawl_Hello",retryOptions, "Tokyo");
   tasks[1] = context.CallActivityWithRetryAsync<string>("Crawl_Hello", retryOptions, "Seattle");
   tasks[2] = context.CallActivityWithRetryAsync<string>("Crawl_Hello",retryOptions, "London");

   await Task.WhenAll(tasks);

   return outputs;
}

每次调用活动时,都会调用编排函数。但是我不想每次调用活动时都从数据库中获取 400k 项。只需在 if 语句中添加所有活动代码,或者这里的正确方法是什么?我看不到它与 WaitAll 函数一起使用。

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

解决方案


看起来您已经找到了解决此问题的方法,正如您在其他查询中提到的那样,但为了其他人的利益,在这里详细说明了这一点。

理想情况下,您应该有一个活动函数来首先获取您需要的所有数据,将它们批处理并调用另一个处理该数据的活动函数。

由于要计算大量元素,因此最好将计算拆分为单独的子编排器,因为扇入操作是在单个实例上执行的。

为了进一步阅读,有一些记录在案的性能目标可以帮助部署持久功能。


推荐阅读