.NET Core 迁移躺坑记续集--Win下莫名其妙的超时
继上一集里说到遇到的各种问题并且弄了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下莫名其妙的超时的更多相关文章
- .NET Core 迁移躺坑记
最近将自己负责的一个核心接口系统从.Net Framework迁移到了.Net Core. 整体过程,从业务层面说一般般吧(整体还好但还是搞的业务有感,没出严重故障)但是技术层面上感觉其实并没有达到要 ...
- android studio 2.32躺坑记
按说这是没啥记录意义的.不过作为一个偶尔用一下ADT开发安卓程序的跨界老码农,遇到一个尴尬事,现在手机已经用上安卓6了,而电脑里的ADT里SDK还是18,19.越来越多的项目是android stud ...
- Android组件化aar躺坑记:ButterKnife 报 元素值必须为常量表达式错误
背景: 项目有需求,将自己写的模块作为一个module给到大项目使用,所以准备把自己的项目打包成aar包. 一.如何将独立项目打包成aar: 1.修改module下的application 为libr ...
- .Net Core 迁移之坑二 《ToString("F") 输出与windows不一致问题》
大家都知道 ToString("F") 是干什么的 这里我还是介绍一下 格式字符串采用以下形式:Axx,其中 A 为格式说明符,指定格式化类型,xx 为精度说明符,控制格式化输出的 ...
- .Net Core 迁移之坑一 《WebAPI Get请求参数传入输入带有[]不识别问题》
在Framwork 体系下 WebAPI项目 会有很多默认特性,例如:Get查询竟然支持三种数组查询方式 1.https://localhost:44390/api/values?status=1&a ...
- .NET CORE迁移踩坑
https://www.cnblogs.com/leolaw/p/10740678.html
- .NET Core爬坑记 1.0 项目文件
前言: 之所以要写这个系列是因为在移植项目到ASP.NET Core平台的过程中,遇到了一些“新变化”,这些变化有编译方面的.有API方面的,今天要讲的是编译方面的一些问题.我把它们整理后分享出来,以 ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- UiAutomator2.0升级填坑记
UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sk ...
随机推荐
- Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块
进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...
- C++堆栈问题
编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配. 解答: (1)代码如下 (2)堆栈分配内存的介绍 一.一个经过编译的C/C++的程序占用的内存分成以下几个部分:1.栈区(stack ...
- Android开发之adb无法连接
2017/11/14 21:20 Unable to run 'adb': null 21:20 'E:\AndroidSDK\platform-tools\adb.exe start-server' ...
- JavaScript函数节流和函数防抖之间的区别
一.概念解释 函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段. 大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片.由于肉眼只能分辨出一定频率的变 ...
- MySQL技术内幕 InnoDB存储引擎(笔记)
1. InnoDB 体系架构 其中,后台程序主要负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据. 此外将已经修改的数据刷新到磁盘文件,同时保证在数据库发生异常的时候Innodb能恢复正常 ...
- 使用xshell链接虚拟机的方法
给大家介绍一下虚拟机和Xshell5连接的基本配置1.安装虚拟机,跟着提示一步一步安装即可,注意添加镜像文件,虚拟机就完成了.2.下载一个Xshell5,安装好之后.要修改虚拟机的网卡状态 1) ...
- IDEA修改编辑背景图片
1.打开File -> Setting -> Plugs -> 搜索BackgroundImage. 然后安装.如图 2.按快捷键ctrl+shift+A,搜索set backgro ...
- sql中关于存在就不做操作的代码块
前言: 在开发中,经常会对数据库表进行新增修改操作,那么如果表中的属性信息已然存在啦!就没必要去做重复的操作了... 代码块 BEGIN SELECT "COUNT"(*) int ...
- RN 开发常见小问题
1 定时器每隔多少秒调用一次 直接贴代码 可复制使用 componentWillUnmount() { this.timer && clearInterval(this.timer) ...
- Java移位运算符详解实例
移位运算符它主要包括:左移位运算符(<<).右移位运算符(>>>).带符号的右移位运算符(>>),移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处 ...