亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Okhttp3、http2多路復用POST請求高峰負載時響應時間長

Okhttp3、http2多路復用POST請求高峰負載時響應時間長

慕絲7291255 2022-07-06 10:48:27
我的應用程序將向我的 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


查看完整回答
反對 回復 2022-07-06
  • 1 回答
  • 0 關注
  • 405 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號