.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