【发布时间】: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