日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

做支付遇到的HttpClient大坑(一)

發(fā)布時(shí)間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 做支付遇到的HttpClient大坑(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(gè)案例是最近剛發(fā)生不久的,只是這個(gè)雷的歷史實(shí)在是久遠(yuǎn)。

公司在3月底因?yàn)橐淮悟v訊云專線故障,整個(gè)支付系統(tǒng)在高峰期停止服務(wù)將近10分鐘。而且當(dāng)時(shí)為了快速解決問(wèn)題止損,重啟了支付服務(wù),事后也就沒(méi)有了現(xiàn)場(chǎng)。我們支付組在技術(shù)架構(gòu)上原先對(duì)專線故障的場(chǎng)景做了降級(jí)預(yù)案,但故障時(shí)預(yù)案并沒(méi)有生效,所以這次我們需要排查清楚降級(jí)沒(méi)有生效的原因(沒(méi)有現(xiàn)場(chǎng)的事后排查,挑戰(zhàn)非常大)。

?

?

微信支付流程

首先回顧一下微信支付的流程(也可以參考https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4):

?

?

這個(gè)過(guò)程是同步的,如果我們的支付系統(tǒng)因?yàn)榫W(wǎng)絡(luò)問(wèn)題,沒(méi)有取到prepay_id,那么用戶就無(wú)法支付;

?

我們的預(yù)案

我們的預(yù)案非常簡(jiǎn)單,就是在請(qǐng)求api.mch.weixin.qq.com時(shí),在HTTPClient中設(shè)置了一個(gè)超時(shí)時(shí)間,當(dāng)支付請(qǐng)求超時(shí)時(shí),我們就請(qǐng)求微信支付的另外一個(gè)備用域名api2.mch.weixin.qq.com,我們的超時(shí)時(shí)間設(shè)置的是3秒;

?

故障現(xiàn)象

每次網(wǎng)絡(luò)抖動(dòng)的時(shí)候,我們從監(jiān)控中都能發(fā)現(xiàn),我們的超時(shí)時(shí)間并沒(méi)有完全起作用。從故障后的監(jiān)控看平均執(zhí)行時(shí)間達(dá)到了10秒,超時(shí)時(shí)間(3秒)完全不管用:從日志中進(jìn)一步分析到,很多請(qǐng)求都是在10秒以上,甚至10分鐘后才報(bào)超時(shí)異常。10分鐘后再降級(jí)到備份域名顯然已經(jīng)沒(méi)有什么意義了。這讓我們開發(fā)很不解,為什么HttpClient的超時(shí)設(shè)置沒(méi)有生效,難道是HttpClient的bug?

以前我們也懷疑過(guò)自己封裝的HTTPClient組件有問(wèn)題,但是我們寫了一個(gè)并發(fā)程序測(cè)試過(guò),當(dāng)時(shí)并沒(méi)有測(cè)試出有串行問(wèn)題或者不支持并發(fā)的問(wèn)題;

?

?

真相-系統(tǒng)層面瓶頸點(diǎn)HttpClient

最近通過(guò)我們測(cè)試(我們組其中一個(gè)開發(fā)在測(cè)試環(huán)境對(duì)故障進(jìn)行了復(fù)現(xiàn))和調(diào)研后,我們發(fā)現(xiàn)支付系統(tǒng)使用的封裝后的HttpsClient工具,同一時(shí)間最多只允許發(fā)起兩個(gè)微信支付請(qǐng)求;當(dāng)這兩個(gè)請(qǐng)求沒(méi)有迅速返回的時(shí)候(也就是網(wǎng)絡(luò)抖動(dòng)的時(shí)候),后面新的請(qǐng)求,只能排隊(duì)等候,進(jìn)而block住線程耗盡tomcat的線程;超時(shí)未生效的原因是因?yàn)镃loseableHttpClient默認(rèn)的實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)連接采用了連接池技術(shù),當(dāng)連接數(shù)達(dá)到最大連接數(shù)時(shí),后續(xù)的請(qǐng)求只能排隊(duì)等待連接,根本就無(wú)法取得發(fā)起網(wǎng)絡(luò)請(qǐng)求的機(jī)會(huì),所以也談不上連接超時(shí)和響應(yīng)超時(shí);

系統(tǒng)本來(lái)應(yīng)該這樣:

實(shí)際卻是這樣:

?

參考和論證

我們從HttpClient的官方文檔中證實(shí)了這一點(diǎn),同時(shí)也寫程序進(jìn)行了驗(yàn)證(這其中的配置比較復(fù)雜和深入,計(jì)劃后續(xù)再寫一篇文章進(jìn)行說(shuō)明,請(qǐng)持續(xù)關(guān)注汪汪隊(duì));

官方文檔:http://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/connmgmt.html?2.3.3.?Pooling connection manager

我們?cè)L問(wèn)微信支付域名api.mch.weixin.qq.com,無(wú)論我們發(fā)起多少個(gè)請(qǐng)求, 在httpclient中就是對(duì)應(yīng)一個(gè)route(一個(gè)host和port對(duì)應(yīng)一個(gè)route),而每個(gè)route默認(rèn)最多只有兩個(gè)connection;而這個(gè)Route的默認(rèn)值,我們代碼中沒(méi)有修改。所以,一臺(tái)tomcat,實(shí)際上同一時(shí)間最多只會(huì)有兩個(gè)請(qǐng)求發(fā)送到微信。網(wǎng)絡(luò)抖動(dòng)的時(shí)候,請(qǐng)求都會(huì)需要很長(zhǎng)時(shí)間才能返回,因?yàn)槲覀冊(cè)O(shè)置的是3秒響應(yīng)超時(shí),所以,當(dāng)網(wǎng)絡(luò)抖動(dòng)時(shí),我們單臺(tái)機(jī)器的qps就是3秒2個(gè),極限情況下一分鐘最多40個(gè)請(qǐng)求;更糟糕的情況,我們的程序中微信退款的超時(shí)時(shí)間設(shè)置的是30秒,所以如果是退款請(qǐng)求,那就是1分鐘只能處理4個(gè)請(qǐng)求,10臺(tái)服務(wù)器一分鐘也就只能處理40個(gè)請(qǐng)求;因?yàn)橹Ц逗屯丝疃际枪灿玫囊粋€(gè)HttpClient連接池,所以退款和支付會(huì)互相影響;

按照HttpClient的設(shè)計(jì),支付系統(tǒng)真實(shí)請(qǐng)求過(guò)程大概如下:

?

經(jīng)驗(yàn)教訓(xùn)

1、對(duì)于微信支付,缺少壓測(cè)。之前壓測(cè)都是基于支付寶,而支付寶的調(diào)用模式和微信完全不一樣,導(dǎo)致無(wú)法及時(shí)發(fā)現(xiàn)這個(gè)瓶頸;

2、研發(fā)對(duì)HttpClient等使用池技術(shù)的組件,原理了解不夠深入,沒(méi)有修改默認(rèn)策略,最終形成了瓶頸;

3、對(duì)報(bào)警細(xì)節(jié)觀察不是很到位,每次網(wǎng)絡(luò)抖動(dòng)我們只看到了網(wǎng)絡(luò)方面的問(wèn)題,卻忽略了程序中超時(shí)參數(shù)未生效的細(xì)節(jié),從而多次錯(cuò)失發(fā)現(xiàn)程序缺陷的機(jī)會(huì),所以“細(xì)節(jié)決定成敗”;

?

轉(zhuǎn)載自:https://www.cnblogs.com/donlianli/p/10917499.html

轉(zhuǎn)載于:https://www.cnblogs.com/technologykai/articles/10970269.html

總結(jié)

以上是生活随笔為你收集整理的做支付遇到的HttpClient大坑(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。