【面试必问】支撑百万并发的"IO多路复用"技术你了解吗?
多路复用其实并不是什么新技术,它的作用是在一个通讯连接的基础上可以同时进行多个请求响应处理。对于网络通讯来其实不存在这一说法,因为网络层面只负责数据传输;由于上层应用协议的制订问题,导致了很多传统服务并不能支持多路复用;如:http1.1,sqlserver和redis等等,虽然有些服务提供批量处理,但这些处理都基于一个RPS(每秒请求数)下。下面通过图解来了解释单路和多路复用的区别。
一、单路存在的问题
每个请求响应独占一个连接,并独占连接网络读写;这样导致连接在有大量时间被闲置无法更好地利用网络资源。由于是独占读写IO,这样导致RPS处理量由必须由IO承担,IO操作起来比较损耗性能,这样在高RPS处理就出现性能问题。由于不能有效的合并IO也会导致在通讯中的带宽存在浪费情况,特别对于比较小的请求数据包。通讯上的延时当要持大量的RPS那就必须要有更多连接支撑,连接数增加也对资源的开销有所增加。
二、多路复用的优点
多路复用可以在一个连接上同时处理多个请求响应,这样可以大大的减少连接的数量,并提高了网络的处理能力。由于是共享连接不同请求响应数据包可以合并到一个IO上处理,这样可以大大降低IO的处理量,让性能表现得更出色。
三、通过多路复用实现百万级RPS
多路复用是不是真的如此出色呢,以下在.net core上使用多路复用实现单服务百万RPS吞吐,并能达到比较低的延时性。以下是测试流程:
由于基础通讯不具备消息包合并功能,所以在BeetleX的基础上做集成测试,主要BeetleX会自动合并消息到一个Buffer上,从而降低IO的读写。
四、测试消息结构
本测试使用了Protobuf作为基础交互消息,毕竟Protobuf已经是一个二进制序列化标准了。
4.1、请求消息
4.2、响应消息
4.3、服务端处理代码
4.4、服务响应对象内容
接收消息后放入队列,然后由队列处理响应,设置请求相应请求时间并记录总处理消息计数。
4.5、客户端请求代码
4.6、客户端测试发起代码
整个测试开启了10个连接,在这10个连接的基础上进行请求响应复用。
五、测试配置
测试环境是两台服务器,配置是阿里云上的12核服务器(对应的物理机应该是6核12线程)
服务和客户端的系统都是:Ubuntu 16.04
Dotnet core版本是:2.14
六、测试结果
6.1、客户端统计结果
6.2、服务端统计信息
6.3、带宽统计
测试使用了10个连接进行多路复用,每秒接收响应量在100W,大部分响应延时在1-3毫秒之间;
6.4、测试代码
https://github.com/IKende/BeetleX/blob/master/samples/MultiplexingConnectionTest.zip
欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
32 岁程序员去面试,因年龄太大被直接送走。。
在互联网企业中,有一个奇怪的现象:年龄越大的程序员,越不敢重用!因为大多数人觉得,程序员到了一定的年龄就不能创造太多价值,要么当公司管理要么改行。 不过我认为这种想法太过片面,为什么人的价值要用年龄来判断?也许到了一定年龄吃不了加班的苦,但是并不能否认大龄程序员的价值,公司注重新人的培养虽然重要,但是一个企业要是没有几个老员工,那么对企业而言是一个非常大的损失! 事情发生不久之前,一位网友发帖称:昨天面试了一个32岁的大龄程序员,我给领导建议是T4,领导说那直接送走吧,好像看到了未来的我”。 32岁在程序员中其实已经可以算得上是大龄了,很多公司都不敢招收,第一是怕养不起,比较32岁的程序员绝大多数都是架构师级别的,而公司职位可能只是需要普通的Curd岗,入不敷出! 第二点是因为大龄问题,不能经常加班之类的,那样企业得到的收益就少很多,这对企业来说是一个无形的损失!两者综合之下,面试被送走好像成为了顺利应当的事1 如果不出去看看,就会被眼前的圈子所蒙蔽! 有一位网友就评论称:“曾经做过一个跨国合作项目,美国那边的同事最大年龄的50多岁,最小的也超过了20,但也和我们一起编码等,他们水平和...
- 下一篇
系统设计之——架构师职责和设计原则
1.架构师职责 分布式存储系统架构师的工作不仅在于整体架构设计,还需要考虑清楚关键实现组节,做到即使只有自己一人也可以把系统做出来,只是需要花费更多的时间而已。 架构师的主要工作包括: 1)权衡架构,从多种设计方案中选择一种与当前团队能力最为匹配的方案。架构设计的难点在于权衡,架构师需要能够在理解业务和业界其他方案的前提下提出通合自已公司的架构。这样的架构既能很好地满足业务需求,复杂度也在开发团队的掌控范围之内。另外,制定系统技术发展略线图,提前做好规划。 2)模块划分、接口设计、代码规范制定。系统如何分层,模块如何划分以及每个模块的职责,模块的接口、客户端接口,这些问题都应该在设计阶段考虑消楚。而不是遗留到编码阶段。另外,确保整个团队的编码风格一致。 3)思考清楚关键实现细节并写入设计文档。架构师需要在设计阶段和团队成员讨论清楚关键数据结构、算法,并将这些内容文档化。如果架构师都不清楚关键实现细节,那么,团队成员往往更不清楚,最终的结果就是实现的系统带有不确定性。如果分布式存储系统存在多处缺陷,那么.系统集成测试或者试运行的时候一定会出现进程Core Dump、数据不正确等问题。这些...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境