上一集里说到遇到的各种问题并且弄了n个解决方案之后,特别是对于问题4的解决方案对于切换了HttpClientFactory

我用了你家netcore 2.1下专门解决之前HttpClient口病已久的灵丹妙药了,信心满满的上线…..然后挂了,该超时的继续超

其中这个问题比较诡异在于超时的主要集中在两台机器上(俗称两兄弟了)

由于不明真相到底是什么导致的,而且接下来又要到五一了,为了欢度五一这么一个伟大艰巨的任务,为了证明迁移core的伟大光荣正确,怎么也要解决掉这个问题

步骤一,先确认问题的复现

首先直接放弃在任何测试环境复现的想法,因为之前在测试HttpClientFactory的时候已经在测试环境里进行过多批次各种场景的压测,无论是长时低压,长时高压,短时高压都进行过都没发生过

而且就算是线上也就2台机器有问题

所以让运维提供ip,指向到这台服务器后,使用superbenchmarker对其进行压测

压测中发现这个….很稳定

稳定5分钟,挂个2分钟

绿色线为RPS每秒请求数,紫色是请求响应时间,发现绿色线稳定5分钟后,会突然没有了(请求卡住了),等个2分钟后突然紫色线突然冒个刺(等待已久的请求终于响应了)然后绿色线又起来了(请求恢复正常)

步骤二,确认超时的时候发生了什么

第二天,开好压测,因为确认了每5分钟后会超时2分钟这个时间,等着个四分钟左右跑到运维那坐着,看下超时期间到底发生了什么。

然后我就绝望了。

常规的比如CPU/内存之类一切正常,考虑到HttpClient有过的历史缺陷比如 .NET HttpClient 的缺陷和文档错误让开发人员倍感沮丧 也特意关注过端口号之类的,也一切正常。

步骤三,迁移前的Framework怎么没有问题,是Core的锅吗

为了证明这个事情,准备了2个console

一个Framework下使用静态的HttpClient每100ms调用某外部接口

一个Core下使用HttpClientFactory也是每100ms调用某外部接口

这个结果让我绝望的平方

结果显示Framework下一切正常,只有Core有问题

后续在补充了几个不同姿势的Core版本的console来测试

包括

1.将SetHandlerLifetime设置为InfiniteTimeSpan

  2.不用HttpClientFactory直接new一个静态HttpClient(和Framework一摸一样的姿势)

依然都会又超时的问题

由于网上google翻了个遍没找到类似的说法

此时的内心想法:难道我要开历史的倒车了么(难道只有我有问题么?还是说我哪里姿势有问题?别人怎么都好好的?难道别人都是假的?网上吹的那么厉害全都是瞎BB?….各种草泥马奔腾而过)

柳暗花明,绝望的时候找下组织吧

然后就在某微信群里发出求救信号

最后得到一个看起来有点靠谱的方案

(截图里的内容,)

文字版描述:创建HttpClient的时候设置UseProxy为false,此值默认值是true

然后使用这个改造后在打包一个console进行测试,这次结果终于看到了希望的曙光了

由于根据之前的规律每5分钟之后会挂2分钟,能活个10分钟基本证明修改有效

跟着这个将站点都修改了UseProxy=false打包上去,进行压测

跑了好几个小时,目前为止并没有发生再超时的问题了,现在基本实锤问题解决了

最后总结

无论你是new一个静态HttpClient还是通过HttpClientFactory去创建HttpClient,记得要将UseProxy=false(当然,除非你要用proxy那就没辙)

当然,最后有几个疑点我也不是太清楚

比如

为什么线上就2台机器恒定有问题?

而其他机器则比较稳定(实际线上服务器接近30台)?

为什么是稳5分钟后超时2分钟(这个5和这个2是哪里设置的)?

UseProxy在这里又是起到了什么样的作用?

群里小伙伴给了这么一个解释

然而我依然不是太理解T-T

.Net世界真是博大精深…

.NET Core 迁移躺坑记续集--Win下莫名其妙的超时的更多相关文章

  1. .NET Core 迁移躺坑记

    最近将自己负责的一个核心接口系统从.Net Framework迁移到了.Net Core. 整体过程,从业务层面说一般般吧(整体还好但还是搞的业务有感,没出严重故障)但是技术层面上感觉其实并没有达到要 ...

  2. android studio 2.32躺坑记

    按说这是没啥记录意义的.不过作为一个偶尔用一下ADT开发安卓程序的跨界老码农,遇到一个尴尬事,现在手机已经用上安卓6了,而电脑里的ADT里SDK还是18,19.越来越多的项目是android stud ...

  3. Android组件化aar躺坑记:ButterKnife 报 元素值必须为常量表达式错误

    背景: 项目有需求,将自己写的模块作为一个module给到大项目使用,所以准备把自己的项目打包成aar包. 一.如何将独立项目打包成aar: 1.修改module下的application 为libr ...

  4. .Net Core 迁移之坑二 《ToString("F") 输出与windows不一致问题》

    大家都知道 ToString("F") 是干什么的 这里我还是介绍一下 格式字符串采用以下形式:Axx,其中 A 为格式说明符,指定格式化类型,xx 为精度说明符,控制格式化输出的 ...

  5. .Net Core 迁移之坑一 《WebAPI Get请求参数传入输入带有[]不识别问题》

    在Framwork 体系下 WebAPI项目 会有很多默认特性,例如:Get查询竟然支持三种数组查询方式 1.https://localhost:44390/api/values?status=1&a ...

  6. .NET CORE迁移踩坑

    https://www.cnblogs.com/leolaw/p/10740678.html

  7. .NET Core爬坑记 1.0 项目文件

    前言: 之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的.有API方面的,今天要讲的是编译方面的一些问题.我把它们整理后分享出来,以 ...

  8. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  9. UiAutomator2.0升级填坑记

    UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...

随机推荐

  1. How To Install and Use Redis

    https://www.digitalocean.com/community/tutorials/how-to-install-and-use-Redis About Redis redis, dev ...

  2. C++笔记019:C++中的const修饰的是一个真正的常量

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 程序一: 我们知道数组的下标不能为变量,必须是一个确定的值.在C语言中看程序: #define a 10 int main() { //第 ...

  3. Effective Java 第三版——41.使用标记接口定义类型

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  4. MVC-AOP(面向切面编程)思想-Filter之IExceptionFilter-异常处理

    HandleErrorAttribute MVC中的基本异常分类: Action异常      T view异常 T, service异常     T, 控制器异常      F(异常get不到), ...

  5. java web 开发实战经典(一)

    一.jsp三种Scriptlet(脚本小程序) 1.<% %>  :定义局部变量.编写语句等. <% String str = "hello world!";// ...

  6. Python函数化编程整理

    1.映射函数 items=[1,2,3,4,5] def inc(x): return x+1 list(map(inc,items)) [2, 3, 4, 5, 6] >>> a ...

  7. 小白突破百度翻译反爬机制,33行Python代码实现汉译英小工具!

    表弟17岁就没读书了,在我家呆了差不多一年吧. 呆的前几个月,每天上网打游戏,我又不好怎么在言语上管教他,就琢磨着看他要不要跟我学习Python编程.他开始问我Python编程什么?我打开了我给学生上 ...

  8. flush()清空文件缓存区

    # 缓冲区:cpu 一级缓存 二级缓存 三级缓存 import time f =open('2.txt','a+' ,encoding='utf-8') f.write('helloworld\n') ...

  9. Java工具类 通过ResultSet对象返回对应的实体List集合

    自从学了JDBC用多了像一下这种代码: List<xxx> list = new Array<xxx>(); if(rs.next()){ xxx x = new xxx(); ...

  10. MySQL性能调优——锁定机制与锁优化分析

    针对多线程的并发访问,任何一个数据库都有其锁定机制,它的优劣直接关系着数据的一致完整性与数据库系统的高并发处理性能.锁定机制也因此成了各种数据库的核心技术之一.不同数据库存储引擎的锁定机制是不同的,本 ...