Уменьшение среднего времени отклика для функции Azure HTTPTrigger при выводе в ServiceBus - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть функция 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?

Что можно сделать для повышения производительности?

Спасибо.

...