面对Azure耐用功能的超时问题
我正在使用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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我建议您每次都不会使用
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.