Netty原理分析

Netty是一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。

作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。

Netty架构分析

Netty 采用了比较典型的三层网络架构进行设计,逻辑架构图如下所示:

第一层:Reactor 通信调度层,它由一系列辅助类完成,包括 Reactor 线程 NioEventLoop 以及其父类、NioSocketChannel/NioServerSocketChannel 以及其父类、ByteBuffer 以及由其衍生出来的各种 Buffer、Unsafe 以及其衍生出的各种内部类等。该层的主要职责就是监听网络的读写和连接操作,负责将网络层的数据读取到内存缓冲区中,然后触发各种网络事件,例如连接创建、连接激活、读事件、写事件等等,将这些事件触发到 PipeLine 中,由 PipeLine 充当的职责链来进行后续的处理。

第二层:职责链 PipeLine,它负责事件在职责链中的有序传播,同时负责动态的编排职责链,职责链可以选择监听和处理自己关心的事件,它可以拦截处理和向后/向前传播事件,不同的应用的 Handler 节点的功能也不同,通常情况下,往往会开发编解码 Hanlder 用于消息的编解码,它可以将外部的协议消息转换成内部的 POJO 对象,这样上层业务侧只需要关心处理业务逻辑即可,不需要感知底层的协议差异和线程模型差异,实现了架构层面的分层隔离。

第三层:业务逻辑处理层,可以分为两类:

1.纯粹的业务逻辑处理,例如订单处理。

2.应用层协议管理,例如HTTP协议、FTP协议等。

接下来,我从影响通信性能的三个方面(I/O模型、线程调度模型、序列化方式)来谈谈Netty的架构。

IO模型

Netty的I/O模型基于非阻塞I/O实现,底层依赖的是JDK NIO框架的Selector。

Selector提供选择已经就绪的任务的能力。简单来讲,Selector会不断地轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读和写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪Channel的集合,进行后续的I/O操作。

线程调度模型

常用的Reactor线程模型有三种,分别如下:

1.Reactor单线程模型:Reactor单线程模型,指的是所有的I/O操作都在同一个NIO线程上面完成。对于一些小容量应用场景,可以使用单线程模型。

2.Reactor多线程模型:Rector多线程模型与单线程模型最大的区别就是有一组NIO线程处理I/O操作。主要用于高并发、大业务量场景。

3.主从Reactor多线程模型:主从Reactor线程模型的特点是服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池。利用主从NIO线程模型,可以解决1个服务端监听线程无法有效处理所有客户端连接的性能不足问题。

序列化方式

影响序列化性能的关键因素总结如下:

1.序列化后的码流大小(网络带宽占用)

2.序列化&反序列化的性能(CPU资源占用)

3.并发调用的性能表现:稳定性、线性增长、偶现的时延毛刺等

链路有效性检测

心跳检测机制分为三个层面:

1.TCP层面的心跳检测,即TCP的Keep-Alive机制,它的作用域是整个TCP协议栈;

2.协议层的心跳检测,主要存在于长连接协议中。例如SMPP协议;

3.应用层的心跳检测,它主要由各业务产品通过约定方式定时给对方发送心跳消息实现。

心跳检测的目的就是确认当前链路可用,对方活着并且能够正常接收和发送消息。作为高可靠的NIO框架,Netty也提供了基于链路空闲的心跳检测机制:

1.读空闲,链路持续时间t没有读取到任何消息;

2.写空闲,链路持续时间t没有发送任何消息;

3.读写空闲,链路持续时间t没有接收或者发送任何消息。

零拷贝

“零拷贝”是指计算机操作的过程中, CPU不需要为数据在内存之间的拷贝消耗资源 。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而  直接在内核空间(Kernel Space)中传输到网络的方式

Netty的“零拷贝”主要体现在三个方面

Netty的 接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝 。如果使用传统的堆内存(HEAP BUFFERS)进行Socket读写,JVM会将堆内存Buffer拷贝一份到直接内存中,然后才写入Socket中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝

读取直接从“堆外直接内存”,不像传统的堆内存和直接内存拷贝

ByteBufAllocator 通过ioBuffer分配堆外内存

Netty提供了 组合Buffer对象 ,可以聚合多个ByteBuffer对象,用户可以  像操作一个Buffer那样方便的对组合Buffer进行操作 ,避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer

Netty允许我们将多段数据合并为一整段虚拟数据供用户使用,而过程中不需要对数据进行拷贝操作

组合Buffer对象,避免了内存拷贝

ChannelBuffer接口:Netty为需要传输的数据制定了统一的ChannelBuffer接口

·       使用getByte(int index)方法来实现随机访问

·       使用双指针的方式实现顺序访问

·       Netty主要实现了HeapChannelBuffer,ByteBufferBackedChannelBuffer,与Zero Copy直接相关的CompositeChannelBuffer类

CompositeChannelBuffer类

CompositeChannelBuffer类的作用是将多个ChannelBuffer组成一个虚拟的ChannelBuffer来进行操作

为什么说是虚拟的呢,因为CompositeChannelBuffer并没有将多个ChannelBuffer真正的组合起来,而只是保存了他们的引用,这样就避免了数据的拷贝,实现了Zero Copy,内部实现

其中readerIndex既读指针和writerIndex既写指针是从AbstractChannelBuffer继承而来的

components是一个ChannelBuffer的数组,他保存了组成这个虚拟Buffer的所有子Buffer

indices是一个int类型的数组,它保存的是各个Buffer的索引值

lastAccessedComponentId是一个int值,它记录了最后一次访问时的子Buffer ID

CompositeChannelBuffer实际上就是将一系列的Buffer通过数组保存起来,然后实现了ChannelBuffer 的接口,使得在上层看来,操作这些Buffer就像是操作一个单独的Buffer一样

Netty的文件传输采用了 transferTo方法 ,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题

Linux中的sendfile()以及Java NIO中的FileChannel.transferTo()方法都实现了零拷贝的功能,而在Netty中也通过在FileRegion中包装了NIO的FileChannel.transferTo()方法实现了零拷贝

Netty 的 Zero-copy 体现在如下几个个方面:

l  Netty 提供了 CompositeByteBuf 类, 它可以将多个 ByteBuf 合并为一个逻辑上的 ByteBuf, 避免了各个 ByteBuf 之间的拷贝。

l  通过 wrap 操作, 我们可以将byte[] 数组、ByteBuf、ByteBuffer等包装成一个 Netty ByteBuf 对象, 进而避免了拷贝操作。

l  ByteBuf 支持 slice 操作,因此可以将 ByteBuf 分解为多个共享同一个存储区域的ByteBuf, 避免了内存的拷贝。

l  通过 FileRegion 包装的FileChannel.tranferTo 实现文件传输, 可以直接将文件缓冲区的数据发送到目标 Channel, 避免了传统通过循环 write 方式导致的内存拷贝问题。

转载于:https://www.cnblogs.com/lfs2640666960/p/10010011.html

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

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

相关文章

福州大学计算机学院董晨老师,福州大学代表队高分斩获第三届福建省高校网络空间安全大赛冠军...

新闻中心讯/10月27日,由福建省教育厅、福建省网络与信息安全协调小组办公室主办的“百越杯”第三届福建省高校网络空间安全大赛在福州圆满落幕,福州大学三支代表队揽获本届大赛的冠军暨特等奖、二等奖和三等奖。本次省赛福州大学派出的代表队由数学与计算…

用uid分库,uname上的查询怎么办?

2019独角兽企业重金招聘Python工程师标准>>> 【缘起】 用户中心是几乎每一个公司必备的基础服务,用户注册、登录、信息查询与修改都离不开用户中心。 当数据量越来越大时,需要多用户中心进行水平切分。最常见的水平切分方式,按照u…

python 新闻摘要_每日新闻摘要:运营商承诺他们不再出售您的位置…

python 新闻摘要Last year it was discovered that Verizon, Sprint, AT&T, and T-Mobile were all selling your real-time location data to third-party companies. They offered no oversight of what the companies did with the data whatsoever, and if that’s not…

计算机复试比重低的学校,又有985院校发布调剂信息,这个34所降低复试比重!...

原标题:又有985院校发布调剂信息,这个34所降低复试比重!01985院校调剂01.清华大学昨天,清华大学发布一则调剂信息:临床医学交叉人才培养项目接受调剂。接收调剂专业如下:据其官网介绍,该项目为推…

Silverlight 解谜游戏 之四 粒子特效

前几篇一直在Blend中工作没体现出开发者的作用,本篇将为订书器(Stapler)添加自定义粒子效果,当订书器被点击时产生更好的视觉效果。其中将使用到nerdplusart 的Silverlight Particle Generator 粒子特效工具。 在结束本章内容后&a…

CS229 1 .线性回归与特征归一化(feature scaling)

线性回归是一种回归分析技术,回归分析本质上就是一个函数估计的问题(函数估计包括参数估计和非参数估计),就是找出因变量和自变量之间的因果关系。回归分析的因变量是应该是连续变量,若因变量为离散变量,则…

注册表被黑客篡改 怎样修复_使用快速注册表黑客设置Office 2007配色方案

注册表被黑客篡改 怎样修复We’ve written previously about how to set the Office 2007 color scheme away from that awful default blue, but you can also set it with a quick registry hack or even via group policy on your network, so we’ll cover that here. 前面…

共享计算机后无法访问磁盘,win10电脑共享硬盘无法访问如何解决

很多用户为了方便文件的传输和访问,就会在局域网中开启硬盘共享,正常是可以通过网络打开访问该用户计算机的磁盘从而读取数据文件,可是有win10系统用户却发现共享硬盘无法访问,武大直接通过网络打开对方的磁盘,该如何处…

如何组合救援磁盘以创建最终Windows修复磁盘

We’ve covered loads of different anti-virus, Linux, and other boot disks that help you repair or recover your system, but why limit yourself to just one? Here’s how to combine your favorite repair disks together to create the ultimate repair toolkit for…

WebService C#开发/调用

简单描述C#开发WebService操作步骤以及调用方式 WebService开发 第一步:创建Web空项目 第二步:为创建的Web空项目添加Web服务 第三步:实现WebService方法(仅供参考) 运行WebService测试 第一步:运行WebService程序,略 …

C语言第九次博客作业--指针

一、PTA实验作业 题目1:两个4位正整数的后两位互换 1. 本题PTA提交列表 2. 设计思路 定义循环变量i,两个数组a[4],b[4] for i0 to 3a[i]*p取各个位*p/10 end for i0 to 3b[i]*q取各个位*q/10 end 分别对*p和*q重新赋值 3.代码截图 4.本题调试过程碰到问题及PTA提交列…

使用CEOP增强的Internet Explorer 8帮助保护您的孩子

Do you want to make Internet Explorer safer and more helpful for you and family? Then join us as we look at the CEOP (Child Exploitation and Online Protection Centre) enhanced version of Internet Explorer 8. 您想使Internet Explorer对您和家人更安全&#xf…

MAC--PPTP教程

第一步点击DocK-系统设置 第二步点击网络,进入网络设置 第三步点击号-创建新服务,创建新的网络连接 第四步接口-选-类型-选-PPTP服务名称-选-然后点击-创建 第五步进入设置页面-服务器地址点击查看虚拟IP列表账户名称-输入试用帐号或是你已充值开通的帐号…

2015计算机应用基础平时作业答案,2015秋《计算机应用基础》第一次作业

2015秋《计算机应用基础》第一次作业 一、单项选择题。本大题共50个小题,每小题 2.0 分,共100.0分。在每小题给出的选项中,只有一项是符合题目要求的。 1. 第一台电子计算机是1946年在美国研制成功的,该机的英文缩写名是______。 …

页面置换算法及例题

一、页面置换算法 不适当的算法可能会导致进程发生“抖动”:即刚被换出的页很快又要被访问,需要将他重新调入,此时又需要再选一页调出。而此刚被调出的页面很快又被访问,又需将它调入,如此频繁地更换页面,以…

vista磁盘使用100%_如何在Windows 7或Vista中创建和使用密码重置磁盘

vista磁盘使用100%Forgetting your password can be an extremely frustrating situation, and we’ve already shared how to reset your password with the Ultimate Boot CD as well as the System Rescue CD, but you can prevent the situation entirely by creating a pa…

Nginx服务状态的监控

一、安装Nginx 使用源码编译安装,包括具体的编译参数信息。 正式开始前,编译环境gcc g 开发库之类的需要提前装好。 安装make: yum -y install gcc automake autoconf libtool make 安装g: yum install gcc gcc-c 一般我们都需要先装pcre, zl…

计算机二级高级应用这么难,计算机二级考试越来越难的实锤!真实数据告诉你到底难在哪里?...

今年3月考试成绩暂时未公布(预计在5月中旬发布),通过率暂时无法得知。但是根据考后后台反馈情况,今年通过率可能再创新低。不管你是不是有感知,计算机二级通过率的确在逐年降低。近3年难度越来越大每次考试结束后后台评论最多的就是“今年的考…

windows 系统监视器_使用Windows 7中的可靠性监视器对计算机问题进行故障排除

windows 系统监视器Windows Vista introduced us to the Reliability and Performance Monitor utility to help keep track of hardware and software crashes. It’s now a stand alone utility in Windows 7 and we will take a look at how to access and use it. Windows …

powerpoint预览_如何安排PowerPoint幻灯片的时间以进行更有效的演示

powerpoint预览Delivering a presentation is not just about giving good slides, it is also about making sure that our presentation finishes by the time our audience wants to have their tea break—so practicing how long to speak for each slide is essential fo…