HttpClient的性能隐患
最近在進(jìn)行開(kāi)發(fā)過(guò)程中,基于都是接口開(kāi)發(fā),A站接口訪(fǎng)問(wèn)B接口接口來(lái)請(qǐng)求數(shù)據(jù),而在這個(gè)過(guò)程中我們使用的是HttpClient這個(gè)框架,當(dāng)然也是微軟自己的框架,性能當(dāng)前沒(méi)有問(wèn)題,但如果你直接使用官方的寫(xiě)法,在高并發(fā)時(shí)候,會(huì)有很大的性能隱患,因?yàn)樗俜绞褂玫氖莡sing的方式,而對(duì)于請(qǐng)求量比較大時(shí),這種方法對(duì)TCP建立也會(huì)過(guò)高,即使用完馬上釋放也會(huì)有很多time_out的請(qǐng)求,所有決定把某個(gè)用到httpclient的組件做成靜態(tài)化的!
明細(xì)
統(tǒng)計(jì)
調(diào)用,中規(guī)中矩的寫(xiě)法
? ? ?var json = JsonConvert.SerializeObject(new{target_index = projectName,timestamp = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),Level = level.ToString(),Message = message});json = json.Replace("target_index", "@target_index").Replace("timestamp", "@timestamp"); ? ? ? ? ? ? ? ? ? ?var httpContent = new StringContent(json, Encoding.UTF8);httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); ? ? ? ? ? ? ? ? ? ?var result = http.PostAsync(apiLoggerUri, httpContent).Result;}
?優(yōu)化它,做成TCP長(zhǎng)鏈接,所以請(qǐng)求走一個(gè)通道
keep-alive關(guān)鍵字可以理解為一個(gè)長(zhǎng)鏈接,超時(shí)時(shí)間也可以在上面進(jìn)行設(shè)置,例如10秒的超時(shí)時(shí)間,當(dāng)然并發(fā)量太大,這個(gè)10秒應(yīng)該會(huì)拋棄很多請(qǐng)求
發(fā)送請(qǐng)求的代碼沒(méi)有了using,即這個(gè)httpclient不會(huì)被手動(dòng)dispose,而是由系統(tǒng)控制它,當(dāng)然你的程序重啟時(shí),這也就被回收了。
通過(guò)上面的改造,我們我系統(tǒng)性能得到了改善,TCP的連接數(shù)也降下來(lái)了
所以對(duì)于長(zhǎng)鏈接的多路復(fù)用技術(shù),相對(duì)于請(qǐng)求過(guò)多的情況還是最省資源的!
原文地址:http://www.cnblogs.com/lori/p/7692152.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的HttpClient的性能隐患的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: AspectCore中的IoC容器和依赖
- 下一篇: 使用acs-engine在Azure中国