Netty源码分析--Reactor模型(二)
这一节和我一起开始正式的去研究Netty源码。在研究之前,我想先介绍一下Reactor模型。
我先分享两篇文献,大家可以自行下载学习。 链接:https://pan.baidu.com/s/1Utym7AS8DHCxrh5aNOD2Ew 提取码:18u3
下面主要是对文献中一些内容和重要的图片进行说明:
1、Each handler may be started in its own thread, 这种方式在客户端负载增加的时候,有很严重的性能问题。

- serversocket的accept方法,阻塞等待client连接,直到client连接成功。
- 线程从socket inputstream outputstream读写数据,会进入阻塞状态,直到全部数据读写完。
- 即使没有数据的读写,仍然会占用一个线程,浪费资源。
2、对上面的模型进行优化, 采用事件驱动的模式,有事件发生的时候才会触发:

Reactor为单个线程,既要处理客户端的accept事件,又要负责发送请求到处理器中。由于只有单个线程,所以处理器中的业务需要能够快速处理完。
3、再次进行改进,加入线程池

这样Reactor线程处理完连接之后,将请求放在线程池中进行处理,不会受到Handler的阻塞。
4、使用多个Reactor

mainReactor负责监听连接,accept连接给subReactor处理,为什么要单独分一个Reactor来处理监听呢?因为像TCP这样需要经过3次握手才能建立连接,这个建立连接的过程也是要耗时间和资源的,单独分一个Reactor来处理,可以提高性能。mainReactor仅仅只负责处理客户端连接,subReactor负责后面的数据的读写。
在解决了什么是Reactor模式后,我们来看看Reactor模式是由什么模块构成。图是一种比较简洁形象的表现方式,因而先上一张图来表达各个模块的名称和他们之间的关系:

上面的图由五大角色构成,下面进行解释:
- Handle(句柄或描述符):本质上是一种资源,由操作系统提供的,该资源用于表示一个个的事件,比如说文件描述符,或是针对网络编程中的Socket描述符,事件既可以来自于外部,又可以来自于内部,外部事件比如客户端的连接请求,客户端数据的读写等等;内部事件比如操作系统产生的定时器事件,它本质上就是一个文件描述符。简单来说,Handle就是事件产生的发源地。
- Synchronous Event Demultiplexer(同步事件分离器):它本身是一个系统调用,用于等待事件的发生(一个或多个)。调用方在调用它的时候会一直阻塞,一直阻塞到同步分离器上有事件产生,对于Linux来说,同步事件分离器指的就是常用的I/O多路复用器,比如说select、poll、epoll等,在Java NIO 领域中,同步事件分离器的组件就是Selector; 对应的阻塞方法就是select()
- Event Hander (事件处理器):本身由多个回调方法组成,这些回调方法构成了于应用相关的对于某个事件的反馈机制,Netty相比于Java的NIO来说,在事件处理器的这个角色上进行了一个升级,它为我们开发者指定了大量的回调方法,供我们在特定时间产生的时候实现相应的回调方法进行业务逻辑的处理。
- Concrete Event Handler(具体事件处理器):是事件处理器的时间,本质上是我们所编写的一个个的处理器的实现
- Initiation Dispatcher (初始分发器):实际上就是Reactor的角色,它本身定义了一些规范,这些规范用户控制事件的调度方式,同时又提供了应用事件处理器的注册、删除等设施,它本身是整个事件处理器的核心所在,会通过同步事件分离器来等待事件的发生,一旦事件发生,首先会分离出一个事件,然后调用事件处理器,最后调用相关的回调方法来处理这些事件。
Netty源码分析--Reactor模型(二)的更多相关文章
- Netty源码分析--内存模型(上)(十一)
前两节我们分别看了FastThreadLocal和ThreadLocal的源码分析,并且在第八节的时候讲到了处理一个客户端的接入请求,一个客户端是接入进来的,是怎么注册到多路复用器上的.那么这一节我们 ...
- Netty 源码分析系列(二)Netty 架构设计
前言 上一篇文章,我们对 Netty做了一个基本的概述,知道什么是Netty以及Netty的简单应用. Netty 源码分析系列(一)Netty 概述 本篇文章我们就来说说Netty的架构设计,解密高 ...
- Netty源码分析 (十二)----- 心跳服务之 IdleStateHandler 源码分析
什么是心跳机制? 心跳说的是在客户端和服务端在互相建立ESTABLISH状态的时候,如何通过发送一个最简单的包来保持连接的存活,还有监控另一边服务的可用性等. 心跳包的作用 保活Q:为什么说心跳机制能 ...
- Netty源码分析--内存模型(下)(十二)
这一节我们一起看下分配过程 PooledByteBuf<T> allocate(PoolThreadCache cache, int reqCapacity, int maxCapacit ...
- Netty源码分析之NioEventLoop(二)—NioEventLoop的启动
上篇文章中我们对Netty中NioEventLoop创建流程与源码进行了跟踪分析.本篇文章中我们接着分析NioEventLoop的启动流程: Netty中会在服务端启动和新连接接入时通过chooser ...
- Netty源码分析之ChannelPipeline(二)—ChannelHandler的添加与删除
上篇文章中,我们对Netty中ChannelPipeline的构造与初始化进行了分析与总结,本篇文章我们将对ChannelHandler的添加与删除操作进行具体的的代码分析: 一.ChannelHan ...
- Netty源码分析之ByteBuf(二)—内存分配器ByteBufAllocator
Netty中的内存分配是基于ByteBufAllocator这个接口实现的,通过对它的具体实现,可以用来分配我们之前描述过的任意类型的BytebBuf实例:我们先看一下ByteBufAllocator ...
- Netty源码分析之NioEventLoop(三)—NioEventLoop的执行
前面两篇文章Netty源码分析之NioEventLoop(一)—NioEventLoop的创建与Netty源码分析之NioEventLoop(二)—NioEventLoop的启动中我们对NioEven ...
- netty源码分析之揭开reactor线程的面纱(二)
如果你对netty的reactor线程不了解,建议先看下上一篇文章netty源码分析之揭开reactor线程的面纱(一),这里再把reactor中的三个步骤的图贴一下 reactor线程 我们已经了解 ...
随机推荐
- 关于ExpandableListView的一个小例子
喜欢显示好友QQ那样的列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到an ...
- 2 WCF里面配置的含义
1 首先介绍所谓的a,b,c. a就是address 地址: b binding 绑定的协议 譬如http tcp udp 利用这些协议方式请求address: c contract 代表请求的规 ...
- It's about trust
所有问题, 最后,它归结为:信任. 你能相信别人? 我不是Low esteem.相反,我有信心.问题是.我有一个别人缺乏信任的. Daria家长们说,伪君子:我们必须相信你. Daria马上问:然后, ...
- 关于Hibernate中hbm2java和hbm2ddl工具
hbm2java:根据映射文件自动生成java源文件 hbm2ddl:根据映射文件自动生成数据库的schema XDoclet:根据带有XDoclet标记的java源文件生成映射文件 Middlege ...
- 区别JS和DOM对象
<div> <button id="bt" onclick="ChangeColor()">Clike To Change Color& ...
- x:Static
用途:访问代码中的变量等 后台定义一个变量 public partial class GetStaticFromBackgroundCode : Window { public static stri ...
- CSS,让100%的宽度,自动减10,让100%的高度,自动减10,可以加减乘除
CSS,让100%的宽度,自动减10,让100%的高度,自动减10,可以加减乘除 实例: .add{ width: calc(100% - 10px); height: calc(100% - 10p ...
- 备份一个个人用的WPF万能转换器
public class CommonCoverter : IValueConverter { /// 转换器参数语法: key1,value1 key2,value2 ... [other,defu ...
- CenOS7 docker部署lnmp环境
Step1:下载lnmp镜像 [root@docker html]# docker pull winstonpro/lnmp Step2:启动lnmp镜像的docker实例 [root@docker ...
- Linux下获取arm的交叉编译工具链
转载请注明文章:Linux下获取arm的交叉编译工具链 出处:多客博图 这里介绍,Linux下获取arm的交叉编译工具链,比如arm-linux-gnueabihf-gcc.arm-linux-gne ...