面对Azure耐用功能的超时问题

发布于 2025-02-11 20:32:53 字数 3370 浏览 1 评论 0原文

我正在使用Azure耐用功能来执行一些批处理处理操作。阅读,过程中的某些内容,通知 预计将执行这些操作的次数为10次

  • ,读,处理
  • ,通知读,通知
  • ,处理,通知
  • 〜10
  • ..

读 这个数字更大,说100 我收到此错误消息: “超时到期。从池中获得连接之前经过的超时期。这可能发生了,因为使用了所有汇集的连接并达到了最大池尺寸。”

负责使用的连接的功能处理程序如下所示:

public async Task<HttpResponseMessage> HandleAsync(string uri, string body, int retryCount)
{
    Ensure.That(uri, nameof(uri)).IsNotNull();
    Ensure.That(uri, nameof(uri)).IsNotEmptyOrWhiteSpace();
    Ensure.That(body, nameof(body)).IsNotNull();
    Ensure.That(body, nameof(body)).IsNotEmptyOrWhiteSpace();
    var iteration = 0;
    HttpResponseMessage response;
    do
    {
        var client = _httpClientFactory.CreateClient();
        var (key, value) = _tokenProvider.GetAuthenticationHeader(_appSetting.PayloadConfig).GetAwaiter().GetResult();
        client.DefaultRequestHeaders.Add(key, value);
        client.DefaultRequestHeaders.Add("api-version","1.0");

        var msg = new HttpRequestMessage(HttpMethod.Post, uri);
        msg.Headers.Add("Accept", "*/*");
        msg.Content = new StringContent(body);
        msg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        response = await client.SendAsync(msg);
        iteration++;
    } while (!response.IsSuccessStatusCode && iteration < retryCount);
    await response.EnsureSuccessStatusCodeAsync();
    return response;
}

如何解决此问题以避免这种饥饿?

我尝试的是编辑此池的最大连接数

private HttpClient Client
        {
            get
            {
                var socketsHandler = new SocketsHttpHandler
                {
                    PooledConnectionLifetime = TimeSpan.FromMinutes(10),
                    PooledConnectionIdleTimeout = TimeSpan.FromMinutes(5),
                    MaxConnectionsPerServer = 100
                };
                
                var _httpClient = new HttpClient(socketsHandler);
                return _httpClient;
            }
        }

,但是使用客户端

public async Task<HttpResponseMessage> HandleAsync(string uri, string body, int retryCount)
        {
            Ensure.That(uri, nameof(uri)).IsNotNull();
            Ensure.That(uri, nameof(uri)).IsNotEmptyOrWhiteSpace();
            Ensure.That(body, nameof(body)).IsNotNull();
            Ensure.That(body, nameof(body)).IsNotEmptyOrWhiteSpace();
            var iteration = 0;
            HttpResponseMessage response;
            do
            {
                var (key, value) = _tokenProvider.GetAuthenticationHeader(_appSetting.PayloadConfig).GetAwaiter().GetResult();
                Client.DefaultRequestHeaders.Add(key, value);
                Client.DefaultRequestHeaders.Add("api-version","1.0");

                var msg = new HttpRequestMessage(HttpMethod.Post, uri);
                msg.Headers.Add("Accept", "*/*");
                msg.Content = new StringContent(body);
                msg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                response = await Client.SendAsync(msg);
                iteration++;
            } while (!response.IsSuccessStatusCode && iteration < retryCount);
            await response.EnsureSuccessStatusCodeAsync();
            return response;
        }

,我仍面临同一问题
谁能在这里引导我

I'm using Azure Durable function to perform some batch processing operations. Something in the lines of Read, Process, Notify
There was a limit of 10, to the number of times these operations were expected to be executed

  • Read, Process, Notify
  • Read, Process, Notify
  • Read, Process, Notify
  • ..
  • ~10 times
  • ..
  • Read, Process, Notify

However if I increase this to a bigger number, say 100
I get this error message:
"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached."

The function handler that is responsible for the connection being used up is as given below:

public async Task<HttpResponseMessage> HandleAsync(string uri, string body, int retryCount)
{
    Ensure.That(uri, nameof(uri)).IsNotNull();
    Ensure.That(uri, nameof(uri)).IsNotEmptyOrWhiteSpace();
    Ensure.That(body, nameof(body)).IsNotNull();
    Ensure.That(body, nameof(body)).IsNotEmptyOrWhiteSpace();
    var iteration = 0;
    HttpResponseMessage response;
    do
    {
        var client = _httpClientFactory.CreateClient();
        var (key, value) = _tokenProvider.GetAuthenticationHeader(_appSetting.PayloadConfig).GetAwaiter().GetResult();
        client.DefaultRequestHeaders.Add(key, value);
        client.DefaultRequestHeaders.Add("api-version","1.0");

        var msg = new HttpRequestMessage(HttpMethod.Post, uri);
        msg.Headers.Add("Accept", "*/*");
        msg.Content = new StringContent(body);
        msg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

        response = await client.SendAsync(msg);
        iteration++;
    } while (!response.IsSuccessStatusCode && iteration < retryCount);
    await response.EnsureSuccessStatusCodeAsync();
    return response;
}

How can I solve this to avoid this starvation?

What I tried was editing this pool's max number of connections

private HttpClient Client
        {
            get
            {
                var socketsHandler = new SocketsHttpHandler
                {
                    PooledConnectionLifetime = TimeSpan.FromMinutes(10),
                    PooledConnectionIdleTimeout = TimeSpan.FromMinutes(5),
                    MaxConnectionsPerServer = 100
                };
                
                var _httpClient = new HttpClient(socketsHandler);
                return _httpClient;
            }
        }

And using the Client

public async Task<HttpResponseMessage> HandleAsync(string uri, string body, int retryCount)
        {
            Ensure.That(uri, nameof(uri)).IsNotNull();
            Ensure.That(uri, nameof(uri)).IsNotEmptyOrWhiteSpace();
            Ensure.That(body, nameof(body)).IsNotNull();
            Ensure.That(body, nameof(body)).IsNotEmptyOrWhiteSpace();
            var iteration = 0;
            HttpResponseMessage response;
            do
            {
                var (key, value) = _tokenProvider.GetAuthenticationHeader(_appSetting.PayloadConfig).GetAwaiter().GetResult();
                Client.DefaultRequestHeaders.Add(key, value);
                Client.DefaultRequestHeaders.Add("api-version","1.0");

                var msg = new HttpRequestMessage(HttpMethod.Post, uri);
                msg.Headers.Add("Accept", "*/*");
                msg.Content = new StringContent(body);
                msg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                response = await Client.SendAsync(msg);
                iteration++;
            } while (!response.IsSuccessStatusCode && iteration < retryCount);
            await response.EnsureSuccessStatusCodeAsync();
            return response;
        }

However, i'm still facing the same issue
Can anyone guide me here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

羁绊已千年 2025-02-18 20:32:55

我建议您每次都不会使用var client = _httpclientfactory.createclient();来创建HTTPCLIENT。
将其移出循环。
并且不要使用Defaultrequestheaders,只需将其设置为请求。

I would suggest that you don't create an HttpClient every time with var client = _httpClientFactory.CreateClient();.
Move it out of the loop.
And don't use DefaultRequestHeaders, just set those on the request instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文