Мы протестировали функцию масштабирования функций Azure с более тяжелым консольным приложением с триггером HTTP и планом обслуживания потребления. Таким образом, мы ожидали параллельного выполнения с масштабированием. Мы запускаем консольное приложение в новом AppDomain, потому что экземпляры funcion работают в одном процессе. В консольном приложении мы выполняем операции с базами данных sqlite в памяти db.azure function scale out
Сначала мы выполнили функцию только 1 раз и измерили время выполнения. Пусть это будет x :) Мы начали непрерывно увеличивать количество параллельных потоков. Мы столкнулись с тем, что время выполнения 1 экземпляра приложения-функции в этих случаях было x * num_of_threads. Так, как если бы экземпляры функции были бы сериализованы и не выполнялись параллельно.
- Что может быть причиной этого? Почему они не выполняются параллельно?
- Какое оборудование есть по умолчанию? Это довольно медленно. Может ли он каким-то образом обновиться в Плане потребления. Почему он не был расширен? Может ли функция sg уменьшить масштаб?
Спасибо вам за помощь.
EDIT: Основной исходный код моего приложения:
using System.Net;
using System;
public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log, ExecutionContext context)
{
string testThreadId = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "id", true) == 0)
.Value;
var funcId = context.InvocationId.ToString();
var homePath = Environment.GetEnvironmentVariable("HOME");
var folderName = Path.Combine(homePath,@"site\wwwroot\JanoRunTime2");
var fileName = Path.Combine(folderName,"AzureFunctionTest.exe");
var configFile = Path.Combine(folderName,"AzureFunctionTest.exe.config");
var setup = new AppDomainSetup();
setup.ApplicationBase = folderName;
setup.ConfigurationFile = configFile;
var newDomain = AppDomain.CreateDomain("JanoTestExecutorDomain_" + funcId, null, setup);
try{
newDomain.ExecuteAssembly(fileName, new []{testThreadId, funcId});
return req.CreateResponse(HttpStatusCode.OK);
}
catch(Exception e){
return req.CreateResponse(HttpStatusCode.InternalServerError);
}
finally{
AppDomain.Unload(newDomain);
}
}
Привет, спасибо. Так может быть сама проблема, что я выполняю свои вещи в новом appdomain? Или только когда я выполняю его async? Я использовал AppDomain.ExecuteAssembly, который, как я знаю, синхронизирован. –
Глядя на [AppDomain.ExecuteAssembly] (https://msdn.microsoft.com/en-us/library/sxx9f4c2 (v = vs.110) .aspx), он фактически не создает новый AppDomain и, кажется, запускается синхронно, поэтому масштабирование должно происходить. Было бы полезно увидеть, как ваш тестовый код пытается воспроизвести. Кроме того, чтобы устранить любую путаницу, Azure Functions будет правильно обрабатывать асинхронные вызовы. Единственный сценарий, когда я могу представить потенциальные проблемы, порождает совершенно новые процессы/AppDomains/threads из функций и не ждет их завершения. –
Я добавил исходный код своего приложения. Я думаю, что созданный новый appdomain создан и консольное приложение выполняется синхронно. –