小编Zyb*_*ber的帖子

Okhttp3、http2复用POST请求高峰负载时响应时间高

我的应用程序将向我的 tomcat 服务器(启用了 http/2)发送大约 1000 个 POST 请求/分钟,它将轮询给定的 url 并返回 html 和响应时间,我想实现真正的 http/2 多路复用以重用 tcp 连接在我的应用程序和 tomcat 服务器之间。我的客户端使用okhttp,我可以成功建立连接并长时间重用它,但是当请求计数增加(例如,排队:50,运行:50)时,响应时间也会增加(它飙升至2000ms- 15000ms 或更糟,通常需要 300ms-500ms)。我可以理解发生这种情况是因为 tcp 连接过载太多请求,所以我决定打开多个 tcp 连接并允许它跨 tcp 连接分配请求负载。我强制客户端使用以下命令打开多个连接

Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(100);
dispatcher.setMaxRequestsPerHost(5);
ConnectionPool cp = new ConnectionPool(5, 5, TimeUnit.MINUTES);
Run Code Online (Sandbox Code Playgroud)

在wireshark的帮助下,我可以看到打开了5个连接,还看到第一次握手成功后立即关闭了4个请求,我不知道这是否是http/2多路复用的预期行为。

如果这是预期的行为,我如何优化它以减少峰值负载时每个请求的响应时间?

或者是否可以使用多个连接在峰值负载时间分配负载?

我的示例程序如下,

Security.insertProviderAt(Conscrypt.newProvider(), 1);
sslContext = SSLContext.getInstance("TLSv1.3");
sslContext.init(null, new TrustManager[] {
    new X509TrustManager() {
        @Override
        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
        }

        @Override
        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
        }

        @Override …
Run Code Online (Sandbox Code Playgroud)

java okhttp http2

6
推荐指数
1
解决办法
1948
查看次数

标签 统计

http2 ×1

java ×1

okhttp ×1