我有一个使用某些规则引擎执行规则的应用程序。我有大约500多个规则,我们的应用程序将收到大约10,000个条目,所有这10,000个条目都应该通过这500条规则进行单独验证。我们目前正计划将所有规则迁移到Azure功能中。也就是说,每个Azure功能都对应一个规则。
所以我尝试了一个概念验证,并使用Task.delay
创建了几个Azure函数来模拟真实的规则验证。我需要为每个请求执行所有500条规则。所以我创建了一个Durable函数作为orchestrator使用Task.WhenAll
调用所有500个活动触发器(规则),但这并不起作用。仅使用一个请求就可以挂起Azure功能。因此,我为规则创建了单独的HttpTrigger
函数。在一个C#类库中,我使用Task.WhenAll
为一个请求调用了所有500个函数,它就像一个魅力。但是,当我尝试为所有条目调用azure函数时(从50开始),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个电话?
请指教。
答案 0 :(得分:3)
我将使用队列触发的函数实现此场景。每个规则每个实体发送一个队列消息,每个函数将选择一个,执行其工作并将结果保存到某个存储。这应该比执行大量同步HTTP请求更具弹性。
现在,Durable Functions基本上在幕后做同样的事情,所以你走的是正确的道路。也许为你的悬挂问题添加一个新的问题,最小的repro。