我的應(yīng)用程序?qū)⑾蛭业?tomcat 服務(wù)器(啟用 http/2)發(fā)送大約 1000 個(gè) POST 請求/分鐘,它將輪詢給定的 url 并返回 html 和響應(yīng)時(shí)間,我想實(shí)現(xiàn)真正的 http/2 多路復(fù)用以重用 tcp 連接在我的應(yīng)用程序和 tomcat 服務(wù)器之間。我的客戶端使用 okhttp,我可以成功建立連接并長時(shí)間重用它,但是當(dāng)請求計(jì)數(shù)增加時(shí)(例如,排隊(duì):50,運(yùn)行:50),響應(yīng)時(shí)間也增加(它飆升到 2000 毫秒- 15000ms 甚至更糟,通常需要 300ms-500ms)。我可以理解這是因?yàn)?tcp 連接過載過多的請求,所以我決定打開多個(gè) tcp 連接并允許它在 tcp 連接之間分配請求負(fù)載。我強(qiáng)制客戶端使用打開多個(gè)連接Dispatcher dispatcher = new Dispatcher();dispatcher.setMaxRequests(100);dispatcher.setMaxRequestsPerHost(5);ConnectionPool cp = new ConnectionPool(5, 5, TimeUnit.MINUTES);在wireshark的幫助下,我可以看到打開了5個(gè)連接,還看到第一次握手成功后立即關(guān)閉了4個(gè)請求,我不知道這是否是http/2多路復(fù)用的預(yù)期行為。如果這是預(yù)期的行為,我該如何優(yōu)化它以減少每個(gè)請求在峰值負(fù)載時(shí)間的響應(yīng)時(shí)間?或者是否可以使用多個(gè)連接在峰值負(fù)載時(shí)間分配負(fù)載?我的示例程序如下,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貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
您看到的是 OkHttp 中連接合并的結(jié)果。OkHttp 不提前知道是否會建立 HTTP/2 連接(與 HTTP/1.1 相比),因此允許連接的 setMaxRequestsPerHost 值繼續(xù)進(jìn)行。目前*沒有客戶端負(fù)載平衡,因此它們會迅速合并為您所看到的單個(gè)連接。
目前,您可以通過多個(gè)客戶端或仔細(xì)管理完全不同的主機(jī)和連接來實(shí)現(xiàn)這一點(diǎn)。nb OkHttp 將在這里對您不利,并針對單個(gè)連接優(yōu)于多個(gè)連接的典型情況進(jìn)行優(yōu)化,例如 SSL 證書指定重疊的主題備用名稱?
*關(guān)注此問題以獲得支持https://github.com/square/okhttp/issues/4530
添加回答
舉報(bào)
0/150
提交
取消
