Netty相关介绍

Spark使用Netty作为网络通住框架,顺带研究了下Netty,把今天成果总结下,后面持续更新。

目录

架构介绍

Reactor模式

内存模型


架构介绍

Netty由Core、Transport Services、Protocol Support三部分组成。Core主要由三部分组成,分别是Zero-Copy-Capable Rich Byte Buffer、Universal Communication API、Extensible Event Model。

Zero-Copy-Capable Rich Byte Buffer

TCP/IP是一个多层协议,在传输过程中传输层、物理层会把应用层的数据转换为字节,然后按照自身协议的输出要求选择合适的字节大小进行拆分或者组合,在拆分或者组合的过程中应用层可能需要多次拷贝数据。数据拷贝对性能存在一定影响,Netty提供的ChannelBuffer是一个零拷贝的Buffer,通过CompositeChannelBuffer和SlicedChannelBuffer两个类实现了组合、拆分的零拷贝,而New I/O原生的ByteBuffer无法做到这点。(注意:这里的零拷贝不同于MMAP)

上图中两个TCP包文需要组合成一个Http应用层的对象。Netty通过ChannelBuffers(注意:多了一个’s’)把两个ChannelBuffer组合成一个ChannelBuffer,返回CompositeChannelBuffer。CompositeChannelBuffer仅仅是存储了多个ChannelBuffer的引用以及它们之间的组合的顺序,不会重新开辟新的内存存储所有的内容。其中SlicedChannelBuffer的思路也一样。

Universal Communication API

JAVA的Old I/O和New I/O是两套不同的API,完全不兼容。针对这种情况Netty提供了统一的API。

Exensible Event Model

Reactor模式

Reactor模式是同步非阻塞I/O的多路复用模式,另外有个叫Proactor模式是异步非阻塞I/O多路复用模式。在分享Reactor模式之前我们先来看在I/O操作需要做哪些事情。如图:外部TCP/IP消息发给了服务器B,消息依次从网卡、内核空间、用户空间、应用程序。没有使用MMAP技术情况下,应用程序都是从用户空间读取消息。

Richard Stevens的《UNIX Network Programming Volume》提到了5种I/O操作模型,分别为Blocking I/O、Nonblocking I/O、I/O Multiplexing、Signal Driven I/O、Asynchronous I/O,前面四种都为同步阻塞I/O或者同步非阻塞I/O,只有AIO为异步非阻塞I/O。

Reactor(也称Event Loop)是一个事件处理模式(),一个或者多个输入类的业务请求并发的被分发到一个叫服务处理程序上,这个服务处理程序就是多路复用器(或者叫多路分发器--Demultiplexer),它分发请求并且以同步的方式路由到相应的请求处理程序。这种模式在并发I/O处理中比较常见。用于同步I/O,核心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,主线程阻塞在多路复用器上。注意:复用指的是线程复用,并不是I/O连接复用,多路是泛指多个连接或者多个通道。Reactor模式由四部分构成。

Resources

         能够为系统提供输入或者消耗系统输出的统称为资源,在Socket的I/O中资源是Handle,即操作系统中的文件句柄。

Synchronous Event Demultiplexer

         使用一个Event Loop阻塞所有资源。当一个Resource在执行了同步阻塞操作后,没有被阻塞的时候这个Demultiplexer会把资源发送给Dispatcher。JAVA语言中提供的Selector实现了Synchronous Event Demultiplexer。需要注意的Demultiplexer的实现需要操作系统劫持非阻塞I/O操作,如:Linux的select、poll、epoll,Maxos的kqueue。

Dispatcher

         负责Request Handler的注册、注销,从Demultiplexer调度分配Resource到相应的Request Handler

Request Handler

         一个应用程序自定义的请求处理程序模块

下图描述了上述四者关系在Reactor模式中相互关系和作用

Reator模式可确保应用处理程序只需要关心业务逻辑即可。Reator模式的扩展能力受限于Request Handler的处理能力和Demultiplexer的实现机制,在Unix中Demultiplexer主要受限于select、epoll、poll的实现。

Netty实现了多个版本的Reator模式,分别为Reactor单线程模型、Reactor多线程模型、主从Reactor多线程模型。一般情况下Reactor的多线程模型已经够用了,但在个别场景中,一个NIO线程负责监听百万客户端连接,需要做SLA、login等可能会存在性能问题。主从Reactor多线程模型可解决这些问题。注意:我们也可以理解Reactor多线程模型为主从模式,主是单线程,从是多线程。

内存模型

 

内存模型文字解说后续补上,这张图包含了内存结构、内存分配、内存查找等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值