У меня есть лазурная функция, которую я вызываю параллельно, используя postasync ...
Я размещаю все свои задачи в очереди, а затем жду ответов параллельно, используя «WhenAll».
Я могу подтвердить, что происходит всплеск активности HTTP в Azure, а затем активность HTTP прекращается на моем локальном компьютере, пока я жду ответов от Azure.
Когда я слежу за функцией на портале Azure, похоже, что запросы поступают каждые три секунды или около того, хотя с моей стороны сетевой трафик отсутствует после первоначального пакета.
Когда я получаю свои результаты, они поступают последовательно, в том же порядке, в котором я их отправлял, даже несмотря на то, что монитор портала Azure показывает, что выполнение некоторых функций занимает 10 секунд, а некоторых - 3 секунды.
Я использую функции Azure версии 1 с тарифным планом потребления.
CentralUSPlan (Consumption: 0 Small)
Мой файл host.json пуст ==> {}
Почему это происходит? Требуются ли какие-то настройки для параллельного выполнения функций Azure?
public async Task<List<MyAnalysisObject>> DoMyAnalysisObjectsHttpRequestsAsync(List<MyAnalysisObject> myAnalysisObjectList)
{
List<MyAnalysisObject> evaluatedObjects = new List<MyAnalysisObject>();
using (var client = new HttpClient())
{
var tasks = new List<Task<MyAnalysisObject>>();
foreach (var myAnalysisObject in myAnalysisObjectList)
{
tasks.Add(DoMyAnalysisObjectHttpRequestAsync(client, myAnalysisObject));
}
var evaluatedObjectsArray = await Task.WhenAll(tasks);
evaluatedObjects.AddRange(evaluatedObjectsArray);
}
return evaluatedObjects;
}
public async Task<MyAnalysisObject> DoMyAnalysisObjectHttpRequestAsync(HttpClient client, MyAnalysisObject myAnalysisObject)
{
string requestJson = JsonConvert.SerializeObject(myAnalysisObject);
Console.WriteLine("Doing post-async:" + myAnalysisObject.Identifier);
var response = await client.PostAsync(
"https://myfunctionapp.azurewebsites.net/api/BuildMyAnalysisObject?code=XXX",
new StringContent(requestJson, Encoding.UTF8, "application/json")
);
Console.WriteLine("Finished post-async:" + myAnalysisObject.Identifier);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine("Got result:" + myAnalysisObject.Identifier);
return JsonConvert.DeserializeObject<MyAnalysisObject>(result);
}
Вы, наверное, хотите сказать, что HttpClient не выполняет запросы параллельно? Что странно, но, возможно, вы попали в ограничение на количество подключений.
Я предполагаю, что проблема в том, что функции azure плохо масштабируются, когда есть более длинные функции рабочей лошадки, которые появляются с перебоями: github.com/Azure/azure-functions-host/issues/1206
Я предполагаю, что этот Раздел 8.1.2.2 Конвейерная обработка говорит: «Сервер ДОЛЖЕН отправлять свои ответы на запросы в том же порядке, в котором они были получены».
Итак, вы говорите, что вывод
DoMyAnalysisObjectHttpRequestAsync
показывает несколько блоков из 3 строк в порядке «выполнение post-async», «Finished posrt-async», «Got result»? Можете ли вы опубликовать вывод консоли?