我的應用程序將向我的 tomcat 服務器(啟用 http/2)發送大約 1000 個 POST 請求/分鐘,它將輪詢給定的 url 并返回 html 和響應時間,我想實現真正的 http/2 多路復用以重用 tcp 連接在我的應用程序和 tomcat 服務器之間。我的客戶端使用 okhttp,我可以成功建立連接并長時間重用它,但是當請求計數增加時(例如,排隊:50,運行:50),響應時間也增加(它飆升到 2000 毫秒- 15000ms 甚至更糟,通常需要 300ms-500ms)。我可以理解這是因為 tcp 連接過載過多的請求,所以我決定打開多個 tcp 連接并允許它在 tcp 連接之間分配請求負載。我強制客戶端使用打開多個連接Dispatcher dispatcher = new Dispatcher();dispatcher.setMaxRequests(100);dispatcher.setMaxRequestsPerHost(5);ConnectionPool cp = new ConnectionPool(5, 5, TimeUnit.MINUTES);在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 public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[]{}; } } }, new java.security.SecureRandom());sslSocketFactory = sslContext.getSocketFactory();Dispatcher dispatcher = new Dispatcher();dispatcher.setMaxRequests(100);dispatcher.setMaxRequestsPerHost(5);ConnectionPool cp = new ConnectionPool(5, 1, TimeUnit.DAYS);okHttpClient = new OkHttpClient().newBuilder().sslSocketFactory(sslSocketFactory, (X509TrustManager)trustManager[0]).dispatcher(dispatcher).connectionPool(cp).hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; }})
1 回答

犯罪嫌疑人X
TA貢獻2080條經驗 獲得超4個贊
您看到的是 OkHttp 中連接合并的結果。OkHttp 不提前知道是否會建立 HTTP/2 連接(與 HTTP/1.1 相比),因此允許連接的 setMaxRequestsPerHost 值繼續進行。目前*沒有客戶端負載平衡,因此它們會迅速合并為您所看到的單個連接。
目前,您可以通過多個客戶端或仔細管理完全不同的主機和連接來實現這一點。nb OkHttp 將在這里對您不利,并針對單個連接優于多個連接的典型情況進行優化,例如 SSL 證書指定重疊的主題備用名稱?
*關注此問題以獲得支持https://github.com/square/okhttp/issues/4530
添加回答
舉報
0/150
提交
取消