多路复用其实并不是什么新技术,它的作用是在一个通讯连接的基础上可以同时进行多个请求响应处理。对于网络通讯来其实不存在这一说法,因为网络层面只负责数据传输;由于上层应用协议的制订问题,导致了很多传统服务并不能支持多路复用;如: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等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

【面试必问】支撑百万并发的IO多路复用技术你了解吗?相关推荐

  1. 面试必问!多线程并发问题

    多线程并发问题,基本是面试必问的. 大部分同学应该都知道Synchronized,Lock,部分同学能说到volatile.并发包,优秀的同学则能在前面的基础上,说出Synchronized.vola ...

  2. 支撑百万并发的“零拷贝”技术,你了解吗?

    " 零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间. 图片来自 Pexels ...

  3. 互联网公司面试必问的mysql题目(下)

    这是mysql系列的下篇,上篇文章地址我附在文末. 什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构.一个非常恰 ...

  4. 面试必问的 CAS ,要多了解

    转载自 面试必问的 CAS ,要多了解 前言 CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术,Doug lea大神在java同步器中大量使用了CAS技术,鬼斧 ...

  5. linux驱动工程面试必问知识点

    linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...

  6. 面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型

    面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型 前言 一.索引 1.1作用 1.2特点 1.3使用 1.3.1创建索引 1.3.2删除索引 1.3.3查看表中的索引 1.3.4查看SQ ...

  7. 看完946页“JAVA高级架构面试必问”,金九银十社招全拿下

    前言 我本科毕业后在老东家干了两年多,老东家算是一家"小公司"(毕竟这年头没有 BAT 或 TMD 的 title 都不好意思报出身),毕业这两年多我也没有在大厂待过,因此找坑的时 ...

  8. Java 面试必问题目,Java 后端校招面试题

    字节跳动一面: 自我介绍,主要讲讲做了什么和擅长什么 看你项目做 Spring 比较多, 问一下 Spring 相关的东西, IoC 是什么概念? Bean 的默认作用范围是什么?其他的作用范围? 索 ...

  9. 互联网公司面试必问的Redis题目

    https://juejin.im/post/5b99d4bce51d450e7a24b66e#heading-0 Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用 ...

最新文章

  1. Youtube-dl调用外部Aria2多线程加速下载
  2. 九维 Addon for SBO 功能说明及新版软件下载
  3. jsp传递参数的四种方法
  4. python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...
  5. selenium webdriver 启动三大浏览器Firefox,Chrome,IE
  6. Track your visitors using an HttpModule
  7. S/4HANA Adapt UI按钮的实现逻辑
  8. 《Imperfect C++中文版》——1.3 运行期契约:前置条件、后置条件和不变式
  9. Python各种推导式(列表推导式,字典推导式,集合推导式,嵌套列表推导式)
  10. Android演示Stack(课下作业)
  11. 本周ASP.NET英文技术文章推荐[03/04 - 03/10]
  12. PHPCMS V9.6.0 SQL注入漏洞EXP
  13. 基于OpenCascade 与COIN3D的机械臂仿真测试
  14. 2020年IT技术的发展趋势!
  15. 四川省巴中市谷歌高清卫星地图下载
  16. 多彩m618plus评测_将来的你 ,一定会感谢现在换鼠标的自己--多彩M618Plus垂直鼠标...
  17. 迅雷php源码,PHP生成迅雷、快车、旋风等软件的下载链接代码实例
  18. 哈罗单车打不开锁,显示:“可能卡住了 重新开锁”
  19. 软工萌新必备app及其用处
  20. python代码审查规则_python代码检查

热门文章

  1. c语言1变A,c语言那些细节之a+1和a+1的区别
  2. android wear无法启用,android-wear – 无法创建Android虚拟设备,“没有为此目标安装系统映像”...
  3. java axis2 开发_基于Apache axis2开发Java Web服务
  4. c2054未定义基类_c++ - 错误C2504:基类未定义 - 堆栈内存溢出
  5. void函数调用时显示不允许使用不完整的_C语言的角落——这些C语言不常用的特性你知道吗?...
  6. pta函数统计素数并求和_黎曼的zeta函数
  7. 小程序云开发数据库在网站读取
  8. Hyperloop 让发布简洁高效
  9. 快速构建Spring Cloud工程
  10. 使用 spring boot 开发通用程序