最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

NoHttpResponseException問題分析解決記錄

 更新時間:2023年08月17日 09:24:13   作者:吾刃尚鋒  
這篇文章主要為大家介紹了NoHttpResponseException問題分析解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

新項目上線遇到NoHttpResponseException的問題

大概11000筆發(fā)到C系統(tǒng)的交易會出現(xiàn)15筆會因這種異常而導(dǎo)致失敗,對月交易量在近三億的系統(tǒng)來說,按照這樣的比例也會有4萬多筆的交易失敗,這種嚴重影響客戶體驗的現(xiàn)象堅決不能容忍。

按照套路網(wǎng)上搜了下這種出現(xiàn)這種異常的原因以及解決辦法,apache網(wǎng)站的解釋是:

In some circumstances,usually when under heavy load, the web server may be able to receive requests but unable toprocess them. A lack of sufficient resources like worker threads is a good example. This may cause the server to drop the connection tothe client without giving any response. HttpClient throws NoHttpResponseException when it encounters such a condition. In most cases it is safe to retry a method that failed with NoHttpResponseException.

意思就是當(dāng)服務(wù)器端由于負載過大等情況發(fā)生時,可能會導(dǎo)致在收到請求后無法處理(比如沒有足夠的線程資源),會直接丟棄鏈接而不進行處理。此時客戶端就回報錯:NoHttpResponseException。 建議出現(xiàn)這種情況時,可以選擇重試。

聯(lián)系了W公司的同事,確認他們的C系統(tǒng)的負載還遠未達到過載的程度,而且我們發(fā)到他們B系統(tǒng)的交易從來沒有出現(xiàn)過這種異常,他們也無法解釋這種異常產(chǎn)生的原因。

抓包看下tcp連接交互的情況

兩筆異常交易的共同點就是(以圖二為例)C系統(tǒng)在2891個包發(fā)來了揮手,然后在2893個包RST了連接,導(dǎo)致我方系統(tǒng)第2888、2889發(fā)的請求沒有收到響應(yīng)就異常結(jié)束了。

2個問題(自問自推測)

1.   C系統(tǒng)為什么會發(fā)送結(jié)束連接的FIN揮手包?

注意到圖二在第2882個包C系統(tǒng)返回前一個請求的響應(yīng)完成(10:16:25),到第2888個包(10:16:46)我方發(fā)送下一個請求,之間有個21s的空閑間隔,圖一中C系統(tǒng)在發(fā)出FIN揮手包之前也有一個20s的空閑間隔,會不會是C系統(tǒng)的服務(wù)器會在每個連接空閑20s后自動就會發(fā)起斷開連接呢?再看下圖三正常結(jié)束交易的tcp流,也是在收到客戶端的確認包后有20s的空閑間隔。

基本上可以推斷出C系統(tǒng)的服務(wù)器會在連接空閑20s后自動發(fā)起斷開連接。

2.   C系統(tǒng)為什么會直接發(fā)出第2893個RST包,而不是發(fā)出正常的Ack確認包?

按照圖二的tcp流序列,客戶端發(fā)出的第2888個包在收到服務(wù)端發(fā)送的第2891個FIN包之前,只個是在客戶端抓的包,請求的網(wǎng)絡(luò)傳輸時間。C系統(tǒng)的服務(wù)端發(fā)出的FIN包時很可能還沒收到我方發(fā)送的第2888個請求。即服務(wù)端發(fā)送FIN包后,馬上就收到了第2888個請求包,以及第2892個[FIN、Ack]包,自身無法判斷是正常結(jié)束,所以就發(fā)出來RST包,關(guān)閉連接。

我方系統(tǒng)是用httpclient4.3的60s的長連接發(fā)送請求,使用的http1.1協(xié)議連接是默認keepalive的,同一個線程的多個請求可以復(fù)用同一個長連接。正是由于c系統(tǒng)發(fā)出FIN包的時間,與我方在連接空閑了20s時仍使用這個連接發(fā)送數(shù)據(jù)時之間微妙的時間差,所以導(dǎo)致出異常的交易都滿足這樣一個現(xiàn)象:即請求發(fā)出去才幾十毫秒就收到了異常。

解決

基本上明確了異常的原因,那解決辦法是?

1.   協(xié)調(diào)W公司變更配置

前面已經(jīng)說了我方系統(tǒng)發(fā)送到W公司B系統(tǒng)的交易,沒有出現(xiàn)過這種異常,說明B系統(tǒng)的服務(wù)端在我方長連接存在的60s時間里沒有主動發(fā)起斷開此連接,推測B系統(tǒng)的連接最大空閑時間是大于60s。這個需要抓下與B系統(tǒng)的tcp包就可以分析出B系統(tǒng)有沒有主動斷開長連接,空閑多少秒斷開兩個信息。那可不可以協(xié)調(diào)W公司,請他們將兩個系統(tǒng)的連接保持最大空閑時間設(shè)置為一致呢?這個只能盡力。

2.   優(yōu)化我方系統(tǒng)

1)http請求使用重發(fā)機制,捕獲NohttpResponseException的異常,重新發(fā)送請求,重發(fā)3次后還是失敗才停止。由于不知道客戶端捕獲到NohttpResponseException這個異常后,客戶端是否自動關(guān)閉了這個連接,每次重發(fā)都需要新建連接發(fā)送。新建連接不存在太長的空閑時間問題,因此能夠通過重發(fā)解決交易失敗的問題。

2)我方系統(tǒng)主動檢查每個連接的空閑時間,允許設(shè)置連接的最大空閑時間M,即客戶端建立的連接空閑M秒后,自動發(fā)起斷開連接。只要這個M時間小于服務(wù)端的最大空閑時間,將完全避免服務(wù)端主動斷開連接導(dǎo)致的異常。

與同事交流,之前鄙司另一個系統(tǒng)到微信支付請求也遇到同樣的NohttpResponseException異常,tcp抓包信息如下圖:

第47970個包是服務(wù)端發(fā)來的FIN包,收到響應(yīng)的ack包立刻就想斷開連接(確認是開啟keep-alive的,連接保持),而客戶端又發(fā)送了新的請求包過去,服務(wù)端就發(fā)送了三條RST包,斷開了連接。異常的原因推測是apache網(wǎng)站的解釋,對方負載過大主動斷開連接,也按照網(wǎng)站推薦的做法,捕獲異常重發(fā),后面就沒有再遇到因這種異常而引起交易失敗。

以上就是NoHttpResponseException問題分析解決記錄的詳細內(nèi)容,更多關(guān)于NoHttpResponseException問題解決的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Java的線程狀態(tài)

    詳解Java的線程狀態(tài)

    本文主要為大家詳細介紹一下Java的線程狀態(tài),文中的示例代碼講解詳細,對我們學(xué)習(xí)有一定的幫助,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-11-11
  • java9區(qū)分opens與exports

    java9區(qū)分opens與exports

    本篇文章主要給大家講述了java9中opens與exports的區(qū)別以及用法的不同之處,一起學(xué)習(xí)下吧。
    2018-02-02
  • spring boot日志管理配置

    spring boot日志管理配置

    這篇文章主要介紹了spring boot日志管理配置的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 詳解Java中實現(xiàn)SHA1與MD5加密算法的基本方法

    詳解Java中實現(xiàn)SHA1與MD5加密算法的基本方法

    這篇文章主要介紹了詳解Java中實現(xiàn)SHA1與MD5加密算法的基本方法,安全哈希算法第一版和消息摘要算法第五版也是通常人們最常用的加密算法,需要的朋友可以參考下
    2016-04-04
  • 如何用Stream解決兩層List屬性求和問題

    如何用Stream解決兩層List屬性求和問題

    這篇文章主要介紹了如何用Stream解決兩層List屬性求和問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java map的學(xué)習(xí)及代碼示例

    Java map的學(xué)習(xí)及代碼示例

    這篇文章主要介紹了Java map的學(xué)習(xí)及代碼示例,簡單介紹了map與collection的比較,map的相關(guān)內(nèi)容,分享了map的一些簡介代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java使用注解實現(xiàn)BigDecimal的四舍五入

    Java使用注解實現(xiàn)BigDecimal的四舍五入

    BigDecimal是Java中的一個類,位于java.math包中,它提供了任意精度的有符號十進制數(shù)字的表示,以及對這些數(shù)字進行算術(shù)運算的方法,本文介紹了Java使用注解實現(xiàn)BigDecimal的四舍五入的相關(guān)知識,需要的朋友可以參考下
    2024-09-09
  • Java Web項目中實現(xiàn)文件下載功能的實例教程

    Java Web項目中實現(xiàn)文件下載功能的實例教程

    這篇文章主要介紹了Java Web項目中實現(xiàn)文件下載功能的實例教程,分別講解了通過超鏈接實現(xiàn)下載以及通過Servlet程序?qū)崿F(xiàn)下載的方式,需要的朋友可以參考下
    2016-05-05
  • Java計算兩個時間段的差的實例詳解

    Java計算兩個時間段的差的實例詳解

    在本篇內(nèi)容中,我們給大家整理了關(guān)于Java計算兩個時間段的差的實例內(nèi)容,并做了詳細分析,有需要的朋友們學(xué)習(xí)下。
    2022-11-11
  • Java?IPage分頁操作 附加自定義sql

    Java?IPage分頁操作 附加自定義sql

    這篇文章主要介紹了Java?IPage分頁加自定義sql,主要包括引入依賴,impl常規(guī)操作,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論

姚安县| 泾阳县| 宜春市| 卫辉市| 宝山区| 科技| 阿拉善左旗| 沧源| 桂阳县| 余江县| 宜昌市| 乌兰浩特市| 肃宁县| 许昌县| 宜川县| 高邑县| 凌海市| 桐城市| 都安| 土默特左旗| 文山县| 万源市| 曲靖市| 永兴县| 侯马市| 沧州市| 甘肃省| 萝北县| 广昌县| 余庆县| 蕉岭县| 饶阳县| 栾城县| 大新县| 固阳县| 高邑县| 盘山县| 胶州市| 万全县| 金华市| 开原市|