又一次Task.Wait引起的教训

        最近一用户在使用BeetleX.HttpClient组件并发访问延时比较高的https服务时引起了卡死现像。由于组件更多使用场景是内部服务和非https,一直没有这情况出现;但用户提供测试场景下这情况必现,所以翻查了一些相关代码。

        protected virtual void OnSslAuthenticate(SslStream sslStream){Task task;if (SslProtocols == null)SslProtocols = System.Security.Authentication.SslProtocols.Tls | System.Security.Authentication.SslProtocols.Tls11 |System.Security.Authentication.SslProtocols.Tls12;task = sslStream.AuthenticateAsClientAsync(SslServiceName, CertificateCollection.Count > 0 ? CertificateCollection : null, SslProtocols.Value, false);task.Wait();}

BeetleX的tcpclient中使了无限超时来等待ssl验证环节,正常局域网环境这个等待是不会卡死的,毕竟网内环境良好要么成功要因异常触发取消等。但在网络差的环境下就存在问题了,socket的异步receive无法触发异常引起这个Wait把线程永久挂起了,当一段时间太多这种情况出现那非常的事情就是大量线程被这个Wait抽干导致服务不能正常工作。

        为了解决这些比较特殊的情况加上超时时间就好了

        protected virtual void OnSslAuthenticate(SslStream sslStream){Task task;if (SslProtocols == null)SslProtocols = System.Security.Authentication.SslProtocols.Tls | System.Security.Authentication.SslProtocols.Tls11 |System.Security.Authentication.SslProtocols.Tls12;task = sslStream.AuthenticateAsClientAsync(SslServiceName, CertificateCollection.Count > 0 ? CertificateCollection : null, SslProtocols.Value, false);if (!task.Wait(5000)){throw new BeetleX.BXException($"connect {mIPAddress}:{mPort} SSL Authenticate timeout!");}}

把超时设置成5秒,在创建连接5秒后ssl还没有握手成功就直接超时关闭连接重新创建。

        基础的问题解决了,但httpclientpool层面还有一个问题需要处理。当连接池一开始处于满负载请求,同时创建大量的Client会引起大量线程等待导致服务不太稳定(毕竟在不很多稳定的网络环境下ssl握手时间有些长)。为了解决问题使用一个指定的线程数的队列来创建ssl握手处理机制,这样就可以避免同时创建大量连接线程引起短暂卡壳现象。

        public Task<HttpClientHandler> Pop(){HttpClientHandler result;TaskCompletionSource<HttpClientHandler> completionSource;lock (this){if (mPools.Count > 0){result = mPools.Pop();result.Using = true;result.TimeOut = BeetleX.TimeWatch.GetElapsedMilliseconds() + TimeOut;return Task.FromResult(result);}if (Clients.Count > MaxConnections){if (mWaitQueue.Count < MaxWaitLength){completionSource = new TaskCompletionSource<HttpClientHandler>();mWaitQueue.Enqueue(completionSource);return completionSource.Task;}else{throw new HttpClientException($"Request {Host} connections limit");}}}completionSource = new TaskCompletionSource<HttpClientHandler>();mCreateDispatchCenter.Next().Enqueue(new CreateClientTask { ClientHandlerPool = this, CompletionSource = completionSource });return completionSource.Task;}struct CreateClientTask{public TaskCompletionSource<HttpClientHandler> CompletionSource;public HttpClientHandlerPool ClientHandlerPool;}private static BeetleX.Dispatchs.DispatchCenter<CreateClientTask> mCreateDispatchCenter= new Dispatchs.DispatchCenter<CreateClientTask>(OnProcessCreateClient, 20);private static void OnProcessCreateClient(CreateClientTask e){try{var result = e.ClientHandlerPool.Create();result.Using = true;result.TimeOut = BeetleX.TimeWatch.GetElapsedMilliseconds() + e.ClientHandlerPool.TimeOut;e.CompletionSource.TrySetResult(result);}catch (Exception e_){e.CompletionSource.TrySetException(e_);}}

简单修改一下连接池Pop方法的代码就可以了。

BeetleX

开源跨平台通讯框架(支持TLS)
提供高性能服务和大数据处理解决方案

https://beetlex.io

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html盒模型向上浮动,HTML5盒模型、浮动和定位

在此之前我们先了解一下块级元素和行内元素的区别一、块级元素1、总是从新的一行开始2、高度、宽度都是可控的3、宽度没有设置时&#xff0c;默认为100%4、块级元素中可以包含块级元素和行内元素二、行内元素1、和其他元素都在一行2、高度、宽度以及内边距都是不可控的3、宽高就…

关于一个js栈溢出的异常

快一年没写web端的东西了&#xff0c;今天写了点东西。唉&#xff0c;快忘了&#xff0c;不过还好&#xff0c;基本的开发技能还是练出来了&#xff0c;这东西不能忘。 另外在这里贴点代码&#xff0c;预防以后会出现类似的情况。 javascript代码 //列表数据var appText new A…

科学中有故事,故事中有科学

▲数据汪特别推荐点击上图进入玩酷屋小木用真金白银来给大家送礼物啦&#xff0c;特别感谢这些年一直以来大家对我们的支持&#xff0c;才让我们越做越好。&#xff08;点我参与送礼活动&#xff09;孩子缺什么&#xff1f;不应该只是知识是独立思考意识、逻辑思维能力基于科学…

[译]WPF开源控件扩展库ControlzEx

原文链接&#xff1a;https://github.com/ControlzEx/ControlzEx翻译&#xff1a;沙漠尽头的狼&#xff08;谷歌及百度提供翻译支持&#xff09;Shared Controlz for WPF支持 .NET Framework&#xff08;4.5.2、4.6.2 及更高版本&#xff09;、.NET Core (3.1) 和 .NET 5&#…

html图片分开,webpack单独分离打包css,css里引用的图片路径错误,怎么解决?

现在我的这个项目是将css和js单独打包出来&#xff0c;打包后的目录结构和打包前一致。打包前&#xff1a;从这张图可以看到&#xff0c;如果是css文件夹根目录下的css文件引用images文件夹下的图片应该使用../就可以了&#xff0c;如果是css下某一个文件夹下面的css引用图片的…

每日一笑 | 程序员千万不能轻易去网吧!

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

.Net Core with 微服务 - Consul 注册中心

上一次我们介绍了 Ocelot 网关的基本用法。这次我们开始介绍服务注册发现组件 Consul 的简单使用方法。服务注册发现首先先让我们回顾下服务注册发现的概念。在实施微服务之后&#xff0c;我们的调用都变成了服务间的调用。服务间调用需要知道IP、端口等信息。再没有微服务之前…

指定特定的内容为首页

2019独角兽企业重金招聘Python工程师标准>>> 默认的情况下&#xff1a;drupal7是将新发表的文件都显示在首页中。 通过下面的方法&#xff0c;指定特定的内容为首页&#xff1a; 管理--》配置--》系统--》站点信息--》默认首页&#xff0c;将相应的内容地址写入&a…

Python到底是有什么魅力,让程序猿为它折腰?

在大数据时代&#xff0c;信息更新非常快速&#xff0c;计算机语言也犹如雨后春笋般被我们所熟知。C语言、C、Java等可谓是各领风骚、独占鳌头&#xff0c;而Python则是一门近几年崛起很快也很火的编程语言。虽说编程语言难分好坏&#xff0c;各有千秋。但Python到底有什么魔力…

jenkins代理设置

2019独角兽企业重金招聘Python工程师标准>>> 抱怨&#xff1a;对于像我这样苦逼的用户&#xff0c;机器在内网&#xff0c;干啥都要“偷偷”通过代理。 言归正传&#xff0c;jenkins\hudson默认并没有提供proxy设置&#xff0c;nexus仓库倒是提供里proxy设置。jenk…

.NET 6 Preview5+VS2022实战千万并发秒杀项目,帅爆了(附源码)

Microsoft 宣布了Visual Studio 2022 的第一个预览版&#xff0c;并且同时也发布了.NET 6 Preview 5。具有里程碑意义的Visual Studio 2022 Preview 1正式发布&#xff0c;重点是64位&#xff0c;而没有增加新功能&#xff0c;并且同时也发布了.NET 6 Preview 5。下面的内容来自…

你们要的印度布线,这是一种极端的牛X

全世界只有3.14 % 的人关注了数据与算法之美前天&#xff0c;数据汪分享了一篇文章「德国布线牛到不行&#xff1f;今天带你看看中国的&#xff01;」&#xff0c;一个中国的布线&#xff0c;小伙伴们表示非常过瘾&#xff0c;强迫症的最爱。不过数据汪也收到不少粉丝留言说&am…

MIPS衰落 LoongArch崛起

不久前&#xff0c;龙芯发布了自主指令集LoongArch和基于LoongArch设计的3A5000&#xff0c;与MIPS彻底分道扬镳。从龙芯最初基于MIPS添加指令&#xff0c;到发展出基于MIPS的LoongISA&#xff0c;再到最新的LoongArch&#xff0c;龙芯的目的是非常明确的&#xff0c;也是显而易…

html答题赚钱源码,WTS在线答题系统 v1.0.0

WTS在线答题系统为在线答题系统(在线考试)&#xff0c;支持在线考试、在线练习等功能... 支持题型&#xff1a;单选题、多选题、填空题、问答题、判断题、附件题、材料题、视频题、音频题支持答题类型&#xff1a;手工配置 试卷答题、随机抽题练习社交功能&#xff1a;试题收藏…

连锁反应装置积木好玩到尖叫!

▲数据汪特别推荐点击上图进入玩酷屋小木用真金白银来给大家送礼物啦&#xff0c;特别感谢这些年一直以来大家对我们的支持&#xff0c;才让我们越做越好。&#xff08;点我参与送礼活动&#xff09;之前推荐的“小小机械师”成了孩子最受欢迎的玩具&#xff0c;玩了的孩子几乎…

chrome vue.js插件文档_神级宝库!GitHub 标星 1.2w+,Chrome 最天秀的插件都在这里啦!...

文章来源&#xff1a;Python空间作者&#xff1a;Rocky0429作为一个在远古时代用过什么 IE、360、猎豹等浏览器的资深器哥&#xff0c;当我第一次了解 Chrome 的时候&#xff0c;就被它的美貌给吸引住了...就在我用了一段时间之后&#xff0c;我坚决的卸载了电脑上其它碍眼的浏…

Android实现通用的ActivityGroup(效果类似Android微博客户端主界面),...

为什么80%的码农都做不了架构师&#xff1f;>>> 可以说ActivityGroup是Google提供的一个非常优秀的API&#xff0c;但它需要做稍微复杂的重写才能用起来比较方便&#xff0c;本文拟将实现这个稍微复杂的重写。TabActivity作为ActivityGroup唯一的子类却让人大失所望…

类选项html 最后无距离,各种距离 一览无遗

offsetLeft,Left,clientLeft的区别假设 obj 为某个 HTML 控件obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算上侧位置&#xff0c;整型&#xff0c;单位像素。obj.offsetLeft 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置&a…

华为起诉最新进展,国内航司暂停运行有关客机,收买家庭不得继续抚养被解救儿童,脸书创始人后悔没早学微信,这就是今天的大新闻...

今天是3月11日农历二月初五今天星期一没带耳机线感觉这样用手机是没有灵魂的下面是今天的大新闻华为起诉最新进展&#xff08;环球网&#xff09;多个来自美国的消息证实&#xff0c;美国的联邦法院已经就华为公司起诉美国政府一案给美国政府及其多位部长发去了法院传票。上图&…

前目的地罗伯森是谁_距离目的地只剩10公里,开车师傅却在高速公路上睡着了...

钱江晚报小时新闻记者 吴崇远 通讯员 俞斐“我从杭州过来&#xff0c;刚才开累了&#xff0c;就休息了几分钟……”“杭州到嘉善那么一点路都犯困了&#xff1f;”4月6日凌晨4点30分&#xff0c;高速交警嘉兴支队值班民警在巡逻时发现&#xff0c;一辆厢式小货车开着双跳灯&…