【问题标题】:Calling hundreds of azure functions in parallel并行调用数百个 azure 函数
【发布时间】:2017-11-19 09:58:31
【问题描述】:

我有一个使用某些规则引擎执行规则的应用程序。我有大约 500 多个规则,我们的应用程序将收到大约 10,000 个条目,所有这 10,000 个条目都应该通过这 500 个规则单独进行验证。我们目前正计划将所有规则迁移到 Azure 函数中。也就是说,每个 Azure 函数都对应一个规则。

所以我尝试了概念验证,并使用Task.delay 创建了几个 Azure 函数来模拟真实的规则验证。我需要为每个请求执行所有 500 条规则。所以我创建了一个 Durable 函数作为编排器,使用 Task.WhenAll 调用所有 500 个活动触发器(规则),但这不起作用。 Azure 函数只需一个请求即可挂起。因此,我为规则创建了单独的 HttpTrigger 函数。在一个 C# 类库中,我使用 Task.WhenAll 为一个请求调用了所有 500 个函数,它就像一个魅力。但是,当我尝试为所有条目(从 50 开始)调用 azure 函数时,Task.WhenAll 开始抛出错误,称任务已取消或TimeoutException 用于 HTTP 调用。下面是代码:

var tasksForCallingAzureFunctions = new List<List<Task<HttpResponseMessage>>>();

Parallel.For(0, 50,  (index) =>
{
  var tasksForUser = new List<Task<HttpResponseMessage>>();

  //call the mocked azure function 500 times 
  for (int j = 0; j < 500; j++)
  {
    tasksForUser.Add(client.SendAsync(CreateRequestObject()));
  }

  //add the tasks for each user into main list to call all the requests in parallel.
  tasksForCallingAzureFunctions.Add(tasksForUser);
});

// call all the requests - 50 * 500 requests in parallel.
Parallel.ForEach(tasksForCallingAzureFunctions,  (tasks) => Task.WhenAll(tasks).GetAwaiter().GetResult());

所以我的问题是,这是推荐的方法吗?我正在进行 50 * 500 次 I/O 调用。要求是所有条目(10000)都应该经过 500 条规则。 我认为的其他选项是将所有条目发送到每个 Azure 函数,以便 Azure 函数具有循环遍历每个条目并验证它们的逻辑。这样我只需要打 500 个电话?

请指教。

【问题讨论】:

    标签: azure architecture task-parallel-library azure-functions


    【解决方案1】:

    我会用队列触发函数来实现这个场景。根据规则为每个实体发送一个队列消息,每个函数都会选择一个,完成它的工作并将结果保存到某个存储中。这应该比执行大量同步 HTTP 请求更有弹性。

    现在,Durable Functions 基本上在幕后做同样的事情,所以你走在了正确的道路上。也许为您的悬挂问题添加一个最少重现的新问题。

    【讨论】:

    • 这是否意味着您建议创建 500 个队列(每个规则一个队列)?
    • 不一定。你打算创建 500 个 HTTP 函数吗?它可以是 1 个队列,并且根据消息内容选择规则。
    • 我在这里添加了另一个关于持久功能的问题 - stackoverflow.com/questions/47415662/…
    • 我不能使用队列,因为所有 500 个 http 函数都应该针对所有请求执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2021-11-26
    • 2013-09-17
    • 2014-06-05
    相关资源
    最近更新 更多