【问题标题】:Break down activity function分解活动功能
【发布时间】:2022-01-12 07:10:30
【问题描述】:

我有一个 Activity 函数,它读取组织中父级的子元素,如下所示:

[FunctionName("ChildReaderFunction")]
public async Task<List<User>> GetChildren([ActivityTrigger] User parent)
{
   var children = await GetChildrenAsync(parent);
   return children;
}
public async Task<List<User>> GetChildrenAsync(User parent)
{        
   var allUsers = new List<User> { parent };
   List<User> children = null;
  
   children = await ExecuteQueryAsync("tableName", $"Parent eq '{parent.Id}'");
   var taskIndex = 0;
   var readTasks = new Task<List<User>>[children.Count(x => x.Childcount > 0)];

   foreach (var child in children)
   {
       if (child.Childcount > 0)
       {
           readTasks[taskIndex++] = GetChildrenAsync(child);
       }
       else
       {
           allUsers.Add(child);
       }
   }
   var validTasks = readTasks.Where(task => task != null).ToList();
   if (validTasks.Count > 0)
   {
       foreach (var result in await Task.WhenAll(validTasks))
       {
          allUsers.AddRange(result);
       }
   }

    Console.WriteLine($"Got {allUsers.Count} children for {parent.Id}");
    return allUsers;
}

当我使用超时 2 小时的高级计划时,这非常有效。我正在尝试将其转换为超时 10 分钟的消费计划。在测试时,我看到超时异常。有没有办法分解这个持久的函数并在 10 分钟内完成执行?

我尝试通过使用队列来更新此逻辑,如下所示:

[FunctionName("ChildReaderFunction")]
public async Task<List<User>> GetChildren([ActivityTrigger] User parent)
{
  var allUsers = new List<User>();
  var directReportEntities = new List<User>();
  Queue<User> myQueue = new Queue<Person>();
  myQueue.Enqueue(request.Parent);
  while (myQueue.Any())
  {
    var current = myQueue.Dequeue();
    if (current.Childcount > 0)
    {
       var children = await GetChildrenAsync(parent);
       foreach (var child in children)
       {
           myQueue.Enqueue(child);
       }
    }
    allUsers.Add(current);
  }
  Console.WriteLine($"Got {allUsers.Count} children for {parent.Id}");
  return allUsers;
}

public async Task<List<User>> GetChildrenAsync(User parent)
{
   return await ExecuteQueryAsync("tableName", $"Parent eq '{parent.Id}'");
}

这也给出了超时异常。关于我可以尝试的其他方法有什么建议吗?

【问题讨论】:

    标签: azure-durable-functions


    【解决方案1】:

    您可能会考虑尝试找出此方法的哪些部分较慢。也许不是方法本身很慢,而是对数据库的查询。您要下载多少行?

    此外,您的方法中有一个递归调用。这可能会导致许多查询被执行。你能想出一种不同的方式来一次抓取所有数据而不是一次抓取一点吗?

    【讨论】:

    • 谢谢!最大行数为 1500。
    猜你喜欢
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多