我们正在检查使用 HttpClient 5.0 中的 HttpAsyncClient,它将在 Flink AsyncFunction 中创建。要求如下:
- 客户端是根据请求创建的;
- SSL 证书应该在运行时从文件中加载;
- 如果发生延迟的特定次数失败,则应重试请求
这是测试的一部分:
final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create().setSslContext(sslContext).build();
final PoolingAsyncClientConnectionManager cm = PoolingAsyncClientConnectionManagerBuilder.create()
.setTlsStrategy(tlsStrategy)
.build();
try (final CloseableHttpAsyncClient httpclient = HttpAsyncClients.custom()
.setConnectionManager(cm)
.setRetryStrategy(new RetryStrategy(3, TimeValue.ofMilliseconds(100)))
.build()) {
httpclient.start();
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(Timeout.of(1000, TimeUnit.MILLISECONDS))
.setResponseTimeout(Timeout.of(1000, TimeUnit.MILLISECONDS))
.build();
HttpClientContext httpContext = HttpClientContext.create();
httpContext.setRequestConfig(requestConfig);
final Future<SimpleHttpResponse> futurePostRequest =
httpclient.execute(request1, httpContext, null);
class RetryStrategy extends DefaultHttpRequestRetryStrategy {
public RetryStrategy(
final int maxRetries,
final TimeValue defaultRetryInterval) {
super(maxRetries, defaultRetryInterval,
Arrays.asList(
// InterruptedIOException.class,
UnknownHostException.class,
// ConnectException.class,
ConnectionClosedException.class,
SSLException.class),
Arrays.asList(
HttpStatus.SC_TOO_MANY_REQUESTS,
HttpStatus.SC_SERVICE_UNAVAILABLE));
}
protected boolean handleAsIdempotent(final HttpRequest request) {
return true;
}
}
DefaultHttpRequestRetryStrategy 被覆盖以允许在 SocketTimeout 异常的情况下重试。
在对响应延迟为 1200 毫秒的 MOCK HTTP 服务器进行重试策略测试时,我发现当我预期所有请求都失败时,部分请求成功(因为超时设置为 1000 毫秒)。例如,我同时调用了上述代码 10 次,其中 3 次请求成功。这是否意味着响应超时可以超过配置?当我将 setMaxtTotal 发送到连接管理器(cm.setMaxTotal(100))时,所有请求都按预期失败。为什么增加连接会解决问题(为每个请求创建连接管理器,它不会被新请求/客户端重用)?这是解决超时问题的正确解决方案吗?
PoolingAsyncClientConnectionManager 的使用是否符合我们的要求?如果不是,如何以其他方式配置 SSL 上下文和重试策略?
谢谢!