HttpClient參觀記:.net core 2.2 對HttpClient到底作了神馬

.net core 於 10月17日發佈了 ASP.NET Core 2.2.0 -preview3,在這個版本中,我看到了一個很讓我驚喜的新特性:HTTP Client Performance Improvements ,並且在Linux上性能提高了60% !併發

以前就一直苦於 HttpClient 的糟糕特性,你們耳熟能詳的 You are using HttpClient wrong。
由於 HttpClient 實現了 IDisposable 若是用完就釋放,Tcp 鏈接也會被斷開,而且一個HttpClient 一般會創建不少個 Tcp 鏈接 。 Tcp 鏈接斷開的過程是有一個 Time_Wait 狀態的,由於要保證 Tcp 鏈接可以斷開,以及防止斷開過程當中還有數據包在傳送。這自己沒有毛病,可是若是你在使用 HttpClient 後就將其註銷,而且同時處於高併發的狀況下,那麼你的 Time_Wait 狀態的 Tcp 鏈接就會爆炸的增加,
他們佔用端口和資源並且還遲遲不消失,就像是在 嘲諷 你。因此臨時解決方式是使用靜態的 HttpClient 對象,No Dispose No Time_Wait函數

後來在 .net core2.1 中,引入了 HttpClientFactory 來解決這一問題。 HttpClientFactory 直接負責給 HttpClient 輸入 全新的 HttpMessageHandle 對象,而且管理 HttpMessageHandle 的生殺大權,這樣斷開 Tcp 鏈接的操做都由 HttpClientFactory 來用一種良好的機制去解決。高併發

上面說了一堆,其實和主題關係不大。 由於我在實際生產環境中,不管使用靜態的 HttpClient 仍是使用 HttpClientFactory ,在高併發下的狀況下 Tcp 鏈接都陡然上升。直到我將 .net core 2.1 升級到 .net core 2.2 preview 問題彷佛奇蹟般的解決了。在介紹 .net core 2.2 如何提高 HttpClient 性能的時候,須要先簡單介紹下 HttpClient :性能

上面說到了 HttpMessageHandle ( 顧名思義:Http消息處理器 ) 它是一個抽象類,用來幹嗎的呢? 處理請求,又是顧名思義。 HttpClient 的發送請求函數 :SendAsync().net

相關文章
相關標籤/搜索