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线程 我们已经了解 ...
随机推荐
- 计算机的组成 —— 磁盘阵列(RAID)
磁盘阵列(Redundant Arrays of Independent Disks,RAID),有"独立磁盘构成的具有冗余能力的阵列"之意.(另外一种常见阵列,FPGA:Fiel ...
- HDU 1143 Tri Tiling(递归)
意甲冠军:一些现有的1*2小盒子.求拼3*n多少个长方形的拼写. 思考: 因为它是一个递归式.肯定会遇到层的关系.仔细观察,研究发现,每层应设置2一层.(奇数层不能是矩形)而从显卡好最后一层的最后一战 ...
- PBS 作业调度应用
PBS(Portable Batch System),最初由 NASA 的 Ames 研究中心开发,主要为了提供一个能满足异构计算网络需要的软件包,用于灵活的批处理(Portable Batch Pr ...
- WPF中的菜单模板
原文:WPF中的菜单模板 资源字典代码如下: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xa ...
- JDBC学习笔记——事务、存储过程以及批量处理
1.事务 1.1.事务的基本概念和使 ...
- WPF党旗和国徽!
原文:WPF党旗和国徽! 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/article/details/18087007 ...
- Angular基本概念理解
一些符号的概念 #nzTable 模块变量 [] 输入(绑定值) () 输出(绑定事件) 补充说明: []是控件监控外部变化 ()是监听事件,交给外部变化内部值的权利 二者都是"监听&quo ...
- 【转载】centos7+tomcat部署JavaWeb项目超详细步骤
我们平时访问的网站大多都是发布在云服务器上的,比如阿里云.腾讯云等.对于新手,尤其是没有接触过linux系统的人而言是比较有困难的,而且至今使用云服务器也是有成本的,很多时候我们可以通过虚拟机自己搭建 ...
- style的继承
第一种方式:瞄准控件的基类 如下例所示,继承ContentControl的控件,都可以使用这个Style <Window.Resources> <Style x:Key=" ...
- nprogress.js 头部进度条使用方法
nprogress.js 头部进度条 引入CSS\JS <link rel="stylesheet" type="text/css" href=" ...