与在本地主机中运行时相比,Azure Function 的 HTTP 请求速度较慢

pin*_*ing 5 performance httpclient azure azure-functions

我正在使用 Azure Function .Net 6 隔离。

当我从 VS2022 在 localhost 上运行该函数时,速度比将其部署到 Azure Function 时快 5 倍。本地主机是在 Azure 中与该函数位于同一区域中托管的 VM。我尝试了不同的服务计划,但问题仍然存在。(消费计划、Elastic Premium EP3、Premium V2 P3v2)

在 localhost 和 localhost 中运行相同的代码。 天蓝色

不同区域与本地主机的结果: 在此输入图像描述

代码如下:

DI - 使用 IHttpClientFactory(此处):

public static class DataSourceServiceRegistration
{        
   public static IServiceCollection RegisterDataSourceServices(this IServiceCollection serviceCollection)
   {
       serviceCollection.AddHttpClient();
       return serviceCollection;
   }
}
Run Code Online (Sandbox Code Playgroud)

HttpClient 用法:

private readonly HttpClient _httpClient;

public EsriHttpClientAdapter(HttpClient httpClient)
{
    _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
}

public async Task<JsonDocument> SendPrintServiceMessage(string url, HttpMethod httpMethod, string referer, IEnumerable<KeyValuePair<string, string>> content = null)
{
    var watch = System.Diagnostics.Stopwatch.StartNew();
    HttpContent httpContent = null;
    if (content != null)
    {
        httpContent = new FormUrlEncodedContent(content);
    }
    var msg = new HttpRequestMessage(httpMethod, url) { Content = httpContent };
    _httpClient.DefaultRequestHeaders.Referrer = new Uri(referer);
    _httpClient.DefaultRequestHeaders.Add("some", "config");

    _logger.LogInformation($"Before SendAsync - time {watch.ElapsedMilliseconds}");
    var result = await _httpClient.SendAsync(msg);
    _logger.LogInformation($"After SendAsync - time {watch.ElapsedMilliseconds}");
    var response = await result.Content.ReadAsStringAsync();
    _logger.LogInformation($"After ReadAsStringAsync - time {watch.ElapsedMilliseconds}");

    if (result.StatusCode == HttpStatusCode.OK)
    {
        //do some stuff here
    }
}
Run Code Online (Sandbox Code Playgroud)

应用洞察如下:

天蓝色:

在此输入图像描述

本地主机:

在此输入图像描述

小智 0

不确定这是否适用于您,但希望它有所帮助。如果您在基本(消耗)计划下运行,您的函数将始终处于冷状态,并且在被 Http 触发器调用时需要启动。为了避免这种情况,如果使用应用服务环境、专用或高级计划,您可以将该功能设置为“始终开启”(如果这在您的预算和范围内)。(换句话说,自由函数总是会冷淡。)

您可以在“配置”>“常规设置”>“始终开启”下更改此设置。

有关函数如何通过冷启动运行的详细信息,请参见:

https://azure.microsoft.com/en-us/blog/understanding-serverless-cold-start/