summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2021-06-23 10:08:15 +0200
committerJon Marius Venstad <venstad@gmail.com>2021-06-23 10:08:15 +0200
commita5a0c1ce5a5b6dcbbe584e5d3bd6510214a10160 (patch)
treec163e5cb8bf04f95c00f3cc31944fb47a1938502
parented7bc94c5c184b1dc735d8db4f95894102cd46f2 (diff)
Try MinimalH2AsyncClient (which is optimized for multiplexing)
-rw-r--r--vespa-feed-client/src/main/java/ai/vespa/feed/client/ApacheCluster.java54
1 files changed, 25 insertions, 29 deletions
diff --git a/vespa-feed-client/src/main/java/ai/vespa/feed/client/ApacheCluster.java b/vespa-feed-client/src/main/java/ai/vespa/feed/client/ApacheCluster.java
index e5d45a2f211..fab6b958369 100644
--- a/vespa-feed-client/src/main/java/ai/vespa/feed/client/ApacheCluster.java
+++ b/vespa-feed-client/src/main/java/ai/vespa/feed/client/ApacheCluster.java
@@ -5,7 +5,7 @@ import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
-import org.apache.hc.client5.http.impl.async.H2AsyncClientBuilder;
+import org.apache.hc.client5.http.impl.async.HttpAsyncClients;
import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
import org.apache.hc.core5.concurrent.FutureCallback;
import org.apache.hc.core5.http.ContentType;
@@ -19,7 +19,7 @@ import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicInteger;
@@ -33,6 +33,13 @@ import static org.apache.hc.core5.http.ssl.TlsCiphers.excludeWeak;
class ApacheCluster implements Cluster {
private final List<Endpoint> endpoints = new ArrayList<>();
+ private final List<BasicHeader> defaultHeaders = Arrays.asList(new BasicHeader("User-Agent", String.format("vespa-feed-client/%s", Vespa.VERSION)),
+ new BasicHeader("Vespa-Client-Version", Vespa.VERSION));
+ private final RequestConfig defaultConfig = RequestConfig.custom()
+ .setConnectTimeout(Timeout.ofSeconds(10))
+ .setConnectionRequestTimeout(Timeout.DISABLED)
+ .setResponseTimeout(Timeout.ofMinutes(5))
+ .build();
ApacheCluster(FeedClientBuilder builder) throws IOException {
for (URI endpoint : builder.endpoints)
@@ -43,6 +50,8 @@ class ApacheCluster implements Cluster {
@Override
public void dispatch(HttpRequest wrapped, CompletableFuture<HttpResponse> vessel) {
SimpleHttpRequest request = new SimpleHttpRequest(wrapped.method(), wrapped.path());
+ defaultHeaders.forEach(request::setHeader);
+ request.setConfig(defaultConfig);
wrapped.headers().forEach((name, value) -> request.setHeader(name, value.get()));
if (wrapped.body() != null)
request.setBody(wrapped.body(), ContentType.APPLICATION_JSON);
@@ -104,29 +113,6 @@ class ApacheCluster implements Cluster {
}
private static CloseableHttpAsyncClient createHttpClient(FeedClientBuilder builder) throws IOException {
- H2AsyncClientBuilder httpClientBuilder = H2AsyncClientBuilder.create()
- .setUserAgent(String.format("vespa-feed-client/%s", Vespa.VERSION))
- .setDefaultHeaders(Collections.singletonList(new BasicHeader("Vespa-Client-Version", Vespa.VERSION)))
- .disableCookieManagement()
- .disableRedirectHandling()
- .disableAutomaticRetries()
- .setIOReactorConfig(IOReactorConfig.custom()
- .setIoThreadCount(2)
- .setTcpNoDelay(true)
- .setSoTimeout(Timeout.ofSeconds(10))
- .build())
- .setDefaultRequestConfig(RequestConfig.custom()
- .setConnectTimeout(Timeout.ofSeconds(10))
- .setConnectionRequestTimeout(Timeout.DISABLED)
- .setResponseTimeout(Timeout.ofMinutes(5))
- .build())
- .setH2Config(H2Config.custom()
- .setMaxConcurrentStreams(builder.maxStreamsPerConnection)
- .setCompressionEnabled(true)
- .setPushEnabled(false)
- .setInitialWindowSize(Integer.MAX_VALUE)
- .build());
-
SSLContext sslContext = builder.constructSslContext();
String[] allowedCiphers = excludeH2Blacklisted(excludeWeak(sslContext.getSupportedSSLParameters().getCipherSuites()));
if (allowedCiphers.length == 0)
@@ -135,11 +121,21 @@ class ApacheCluster implements Cluster {
ClientTlsStrategyBuilder tlsStrategyBuilder = ClientTlsStrategyBuilder.create()
.setCiphers(allowedCiphers)
.setSslContext(sslContext);
- if (builder.hostnameVerifier != null) {
+ if (builder.hostnameVerifier != null)
tlsStrategyBuilder.setHostnameVerifier(builder.hostnameVerifier);
- }
- return httpClientBuilder.setTlsStrategy(tlsStrategyBuilder.build())
- .build();
+
+ return HttpAsyncClients.createHttp2Minimal(H2Config.custom()
+ .setMaxConcurrentStreams(builder.maxStreamsPerConnection)
+ .setCompressionEnabled(true)
+ .setPushEnabled(false)
+ .setInitialWindowSize(Integer.MAX_VALUE)
+ .build(),
+ IOReactorConfig.custom()
+ .setIoThreadCount(2)
+ .setTcpNoDelay(true)
+ .setSoTimeout(Timeout.ofSeconds(10))
+ .build(),
+ tlsStrategyBuilder.build());
}
private static class ApacheHttpResponse implements HttpResponse {