基于单TCP连接的高吞吐模型设计

        对于服务与服务之间往往需要高效的吞吐的信息交互,但在绝大部分服务应用中为了实现高吞吐交互都是基于连接池模式,即通过多个TCP连接来提高吞吐量,这种设计完全是通过增加IO的读写量来实现高效吞吐。

        如果能减少连数和降低IO量(合并)来提高吞吐量那在同样吞吐交互的情况即可以节省更多的资源。但这种设计需要从上层应用调度和协议设计相结合才能实现,同样这个应用调度设计会变得比较复杂。接下来介绍一下如何实现这样一个应用模型。

协议制定

        如果想在一个TCP连接上达到最高的吞吐能力,那必须制定一个连接可复用的协议,即协议支持一个TCP连接给多个会话并发接收和发送消息。接下来通过一些协议的工作情况来做对比

HTTP1.1

        这协议是当前使用最广泛的通讯应用协议,它的通讯模式如下:

协议约束了当前连接必须等待响应后才能继续下一个请求,如果需要高吞吐交互那只能通过更多的连接来支持;上层应用大量的连接和IO读写会带来更多资源的开销。每个请求最少使用一次socket  write和read.

HTTP1.1 Pipelining
        这是一种特性则是针对场景的应用方式,其处理方式如下

这样的好处理就即多个请求响应可以合并到单个socket write和read里,节省IO读写的次数大大提高性能。但这种模式下一个连接也只能针对一个会话使用,很难应用多到个会话并发中。它的请求响应顺序还需要保持一致。

HTTP2.0

        HTTP2.0协议提供了连接复用能力,这样多个请求就无须排列等上一个完成即可以处理下一下。

它们的请求响应并没有固定的顺序,不过有一个ID标签来维护它们的响应关系。只要不同会话的通讯交互ID不同,那即使多会话在并发上用同一个连接处理也不会产生影响。对于多个Request和Response是不是会合并到一个socket write和read里那就要看应用的模型设计了。

        总体上来说HTTP2.0协议支持单TCP连接的高吞吐应用需求,在设计过程中可能参考相关特性。只有协议并不能满足应用的需要,更重要是多个会话使用同一个连接进行交互的同时相互不存在影响。

调度模型设计

        如果想一个连接满足多个会话并发需要,那必须设计一个针对消息的发送和接收调度模型;通过这个调度模型把会话并发之前的影响切割出来。同样这个模型对消息处理进行分离切割外还需要加入IO合并处理,把多请求响应尽可能用最少的socket write和read来处理从而达到更低的资源使用。

整个逻辑设计起来比较复杂,通过Stream把Socker操作的buffer进行隔离,这样在读和写的过程都可以做一个批量的Socket read和write.消息解码和编码通过队列做一个分隔,在消息处理通过线程池把不同会话的请求进行一个隔离处理。

应用效果

        由于BeetleX已经完全基于这种模型来设计,但上层扩展还是需要做消息处理调度。接下来看一下BeetleX.XRPC基于这种模型进行远程接口调用达到怎样的效果。以下是一个简单用户信息获取的服务和Client接口调用测试代码

        //serverpublic Task<List<User>> List(int count){List<User> result = new List<User>();for (int i = 0; i < count; i++){User user = new User();user.ID = Guid.NewGuid().ToString("N");user.City = "GuangZhou";user.EMail = "Henryfan@msn.com";user.Name = "henryfan";user.Remark = "http://ikende.com";result.Add(user);}return Task.FromResult(result);}//clientstatic async Task MutilTest(){while (true){await UserService.List(1);System.Threading.Interlocked.Increment(ref mCount);}}

开启了500个用户用同一个tcp client进行服务调用的测试结果,

RPS达到30万,针对E3-1230V2这CPU资源来说,使用连接池的方式都难以达到20万RPS的接口调用,但基于一个连接反而提升到30万;这么高的吞吐归功于连接复用的过程中对读写网络IO合并了。

        由于这个模型设计每个连接只能由于一个线程来处理协议分析,当协议比较复杂的情况那一定程度限制了吞吐能力。当这种模型碰到CPU资源充足的情况下可以适当地加多一到两个连接即可满足需求。

        接下来针对一个连接多会话并发能跑到多大的带宽?把测试代码修改一下

        //clientstatic async Task MutilTest(){while (true){await UserService.List(100);System.Threading.Interlocked.Increment(ref mCount);}}

改成每次返回100个对象。

E3-1230V2的CPU在测试过程占用50%的资源 ,单个TCP连接跑到接近2G的带宽,RPS大概在2.5万,每个请求返回100个对象列表;大量消息序列化占用了比较多的协议处理资源。

注意

        在这种模型不要刻意去通过加连接数来提高吞吐,加大连接数意味着socket的write和read合并数量降低,同样数量的吞吐可能引起更高的write和read这样反倒影响性能。具体分配多少个连接是最优则看硬件资源而定,就拿E3-1230V2这个测试情况来说,如果多加一个连接吞吐量并没有太多提高但CPU使用率则提升了好多,主要是socket的write和read的数量增加太多了。

        这种模型还有一个缺点是低吞吐的情况延时有所提高,主要是跨越几个线程调度,每个环节不饱和的情况下会引线程在线池间的切换引起一些调度上的延时。

示例代码:

https://github.com/beetlex-io/BeetleX-Samples/tree/master/XRPC.Performance

BeetleX

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

https://beetlex.io

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

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

相关文章

程序员8大终极杀器,你get了几个?

全世界有3.14 % 的人已经关注了数据与算法之美经常有同学问&#xff1a;作为程序员&#xff0c;终极杀器是什么&#xff1f;其实有大佬早已回答过&#xff1a;持续学习&#xff0c;开阔视野才是程序员的终极杀器&#xff01;基于此&#xff0c;给大家一个建议&#xff1a;不妨多…

winserver2016 401您无权使用所提供的凭据查看此目录或页面_不用找了,30分钟帮你搞定使用 Spring Cloud 和 Docker 轻松构建微服务架构!...

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]【编者的话】如何使用Spring Boot、Spring Cloud、Docker和Netflix的一些开源工具来构建一个微服务架构。本文通过使用Spring Boot、Spring Cloud和Docker构建的概念型应用示例&#xff0c;提供了了解常见的微服务架构模式…

女朋友掉水里,各类程序猿怎么救?

全世界有3.14 % 的人已经关注了数据与算法之美前天发了一篇有趣的文章《如果辅导员掉进水里&#xff0c;各个专业的学生将会如何解救&#xff1f;》那么&#xff0c;如果程序猿的女朋友落水了&#xff0c;他们会怎么救呢&#xff1f;不会像在校的计算机学院的学生那样“找跟网线…

联机分析的列式数据库 clickHouse

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。在传统的行式数据库系统中&#xff0c;数据按如下顺序存储&#xff1a;RowWatchIDJavaEnableTitleGoodEventEventTime#0893543506621Investor Relations12016-05-18 05:19:20#1903295099580Contact us12016-05-…

网管小王的工具包

我是一名网管&#xff0c;工作主要是维护单位的网络线路和电话线路&#xff0c;今天闲来没事&#xff0c;把工具包中的工具show一下吧。笔记本电脑打线器&#xff0c;用来维修模块和打线用的两根长短不同的网线和一根电话线螺丝刀&#xff0c;什么扁口&#xff0c;十字花&#…

.NET之生成数据库全流程

开篇语本文主要是回顾下从项目创建到生成数据到数据库(代码优先)的全部过程。采用EFCore作为ORM框架。本次示例环境&#xff1a;vs2019、net5、mysql创建项目本次事例代码是用过vs2019创建的ASP.NET Core Web API项目可以通过可视化界面创建或者通过命令行创建dotnet new webap…

进军人工智能,数学基础很重要?

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。对于大多数新手来说&#xff0c;弄清楚入门人工智能需要哪些数学基础、需要熟悉什么框架等&#xff0c;都至关重要。机器学习是一个异常丰富的研究领域&#xff0c;有大量未解决的问题&#xff1a;公正、可解释性、易…

修改正文中参考文献标注_论文写作中怎样正确插入参考文献,引用文献如何标注?...

论文写作中怎样正确插入引文文献&#xff0c;引用文献如何标注&#xff1f;不管是大学毕业生还是期刊/评职称的我们在面对撰写论文时&#xff0c;参考文献的引用是必不可少的。参考文献的引用可以给论文增添很多的光彩。正确的在论文中引用参考问下你会在论文编写的同时省去很大…

.Net之多语言配置

开篇语首先非常感谢各位朋友或技术爱好者的关注。介绍支持多语言使网站可以覆盖更广泛的受众。ASP.NET Core 提供的服务和中间件可将网站本地化为不同的语言。本次示例环境&#xff1a;vs2019、net5配置无需引用Nuget包即可实现以下功能。注入容器services.AddLocalization(t &…

21张GIF动图让你秒懂数学原理

全世界有3.14 % 的人已经关注了数据与算法之美数学是很难的科学&#xff0c;但因为它是科学家用数学来解释宇宙的语言&#xff0c;我们无可避免的要学习它。看看下面的这些GIF动图&#xff0c;它们提供了视觉的方式来帮助你理解各种数学技巧。推荐阅读《12堂魔力数学课》。1.椭…

表格过滤器_记录和管理零散信息,什么软件比 Excel 表格更方便

SeaTable 的目标是帮助大家更好的组织和管理各种零散的信息&#xff0c;团队的请假信息就属于这样一类零散的信息。下面我们来看一下 &#xff0c;SeaTable 相比于 Excel 是如何更好的帮助我们来组织和管理这样的信息的。用 Excel 记录的团队请假信息下面两张表是比较常见的请假…

使用 Source Generator 代替 T4 动态生成代码

使用 Source Generator 代替 T4 动态生成代码Intro在 Source Generator 出现之前有一些重复性的代码&#xff0c;我会使用 T4 去生成&#xff0c;这样就可以一定程度上避免复制粘贴和可维护性也会更好一些。在了解了一些 Source Generator 之后&#xff0c;就想尝试把现在项目里…

资料分享 | 数据挖掘实例资料分享来袭

小编从大学开始&#xff0c;便开启资料收集功能。随着大数据时代的来临&#xff0c;计算机发展进入新的阶段&#xff0c;再加上日常的深入研究&#xff0c;小编收集整理了丰富的数据挖掘资料&#xff0c;内容涵盖“程序”&#xff0c;“数据”、“文档”等。这次小编再次把所有…

修改图层的范围_【PS|第39期】数字绘画 使用填充图层

惟有悲观净化而成的乐观&#xff0c;才是真正的乐观。——尼采)填充图层是一种只承载纯色、渐变和图案的特殊图层&#xff0c;其特点是填充内容可以修改。另外&#xff0c;设置成不同的混合模式和不透明度后&#xff0c;可用于修改其他图层的颜色或生成图像混合效果。填充图层都…

我的注释那去了?

当我们用nuget引用三方库时&#xff0c;在类型&#xff0c;或类型成员上会有注释&#xff0c;如下图&#xff0c;是MySql官方包&#xff0c;command的ExecuteNonQuery的注释我们自己写一个类库项目CommentsLibrary&#xff0c;给类&#xff0c;构造函数&#xff0c;方法添加xml…

[原] jQuery EasyUI 1.2.6源码、Demo合集、离线API

下载地址&#xff1a; http://files.cnblogs.com/purediy/jquery-easyui-1.2.6.zip 兄弟版本&#xff1a; jQuery EasyUI 1.3.4 离线API、Demo jQuery EasyUI 1.3.2 离线API、Demo jQuery EasyUI 1.3.0 Demo合集、离线API、动态换肤 相信关注过jQuery UI 的大部分都查到过easyu…

看书的一点小建议!

阅读本文大概需要6分钟。昨天看见小北写了一篇&#xff1a;「看书的一点小建议」&#xff0c;写的很不错&#xff0c;今天也分享一下自己看书的心得。其实不少读者问过我怎么看计算机经典大厚书、怎么看产品运营经典大厚书、怎么提高看书效率&#xff1a;电影教父里有台词&…

技巧:Excel用得好,天天没烦恼

全世界有3.14 % 的人已经关注了数据与算法之美Excel是Office三大神器当中最神秘、但也是最能提高你效率的工具了。而我们中的太多小伙伴&#xff0c;却一直把它当做是个“电子表格工具”。今天一起涨姿势&#xff0c;学会下面这些神技&#xff0c;你的Excel分分钟超过90%的同事…

操作数数据类型 char 对于 sum 运算符无效。_数据类型和运算符

数据类型和运算符1.进制1.1文件存储单位​ 任何数据在计算机中都是以二进制的形式存在的&#xff0c;二进制早期由电信号开关演变而来 。​ 一个电信号或者一个二进制位统称为Bit位&#xff0c;8个Bit位为一组组成一个字节Byte 。​ 一个bit位表示的数的范围&#xff1a;0和1​…

我所理解的开源软件供应链安全

点击上方“开源社”关注我们| 作者&#xff1a;庄表伟| 编辑&#xff1a;钱英宇| 设计&#xff1a;谭嘉露| 责编&#xff1a;王玥敏1供应链与断供隐喻会帮助人&#xff0c;也会误导人。当我们谈到“供应链”时&#xff0c;会产生哪些联想&#xff1f;环环相扣&#xff1f;缺一不…