У меня есть функция POST Azure, единственной целью которой является получение некоторой полезной нагрузки и сохранение ее в очереди ServiceBus из пространства имен ServiceBus.
Весь код, представленный ниже, работает, выполняет простую работуи совсем не сложен;однако, в зависимости от используемой версии, могут быть получены разные средние значения времени отклика.
Я сделал WebTest, который я использовал для LoadTest, чтобы получить эти средние значения.время отклика в следующей конфигурации: 1 полезная нагрузка JSON, 1 одновременный пользователь, время прогрева 20 секунд, длительность теста => 3 минуты.
Я хотел бы отметить, что для WebTest мне пришлось использовать TLSПлагин.
Версия 1: (в этой версии среднее время ответа LoadTest составляет ~ 500 мс)
[FunctionName("DataCreate")]
public static async Task<HttpResponseMessage> CreateData([HttpTrigger(AuthorizationLevel.Function, "post", Route = AppRoutes.CreateDataRoute)]HttpRequestMessage req,
[ServiceBus(queueOrTopicName: "MyServiceBusQueue", Connection = "sbconnection", EntityType = EntityType.Queue)] IAsyncCollector<String> dataCollector,
ExecutionContext context,
TraceWriter log)
{
try
{
var requestBody = await req.Content.ReadAsStringAsync();
await dataCollector.AddAsync(requestBody);
return req.CreateResponse(HttpStatusCode.OK);
}
catch (JsonException jsonException) {
return ErrorHandler.HandleDataFormatError(req, log, jsonException);
}
catch (Exception e)
{
return ErrorHandler.HandleFatalError(req, log, e);
}
}
Версия 2: (в этой версии среднее время ответа составляет ~ 1,5секунд
[FunctionName("DataCreate")]
public static async Task<HttpResponseMessage> CreateData([HttpTrigger(AuthorizationLevel.Function, "post", Route = AppRoutes.CreateDataRoute)]HttpRequestMessage req, ExecutionContext context, TraceWriter log)
{
try
{
var requestBody = await req.Content.ReadAsStringAsync();
var message = new BrokeredMessage(requestBody);
QueueClient queueClient = QueueClient.CreateFromConnectionString(ConfigurationManager.AppSettings["sbconnection"], "MyServiceBusQueue");
await queueClient.SendAsync(message);
return req.CreateResponse(HttpStatusCode.OK);
}
catch (JsonException jsonException) {
return ErrorHandler.HandleDataFormatError(req, log, jsonException);
}
catch (Exception e)
{
return ErrorHandler.HandleFatalError(req, log, e);
}
}
Версия 3: (в этой версии среднее время отклика составляет около 1 секунды)
[FunctionName("DataCreate")]
[return: ServiceBus("MyServiceBusQueue", Connection = "sbconnection")]
public static async Task<String> CreateData([HttpTrigger(AuthorizationLevel.Function, "post", Route = AppRoutes.CreateDataRoute)]HttpRequestMessage req, ExecutionContext context, TraceWriter log)
{
var requestBody = await req.Content.ReadAsStringAsync();
return requestBody;
}
Ожидается, что среднее время отклика будет примерно равным ~ 100 мсили, может быть, чуть выше, но определенно не ~ 500 мс или более.
Это ожидаемое среднее время ответа, учитывая, что по существу функция выполняет очень мало, просто получает некоторые данные через содержимое запроса и отправляет их черезв очередь ServiceBus?
Что можно сделать для повышения производительности?
Спасибо.