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线程 我们已经了解 ...
随机推荐
- wpf中的倒影效果实现
原文:wpf中的倒影效果实现 <TextBox Name="txt" FontSize="30" ...
- 神户制钢坑了500家企业 百年老店为何走上邪路?(企业经营再艰难,也不能降低产品质量,甚至偷工减料,同样适用于IT行业)
神户制钢这颗烂萝卜,拔出它之后带出的泥越来越多.上周五社长川崎博也又开了记者会,再次道歉,而受到其数据造假影响的客户数量也从200家飙升到500家. 日本政府给神户制钢两周时间调查,还要在一个月内公布 ...
- 图形的认识(curve,surface,hypersurface)
平滑函数(smooth function): curve:曲线: 二维平面: surface:曲面: 三维空间: hypersurface:超曲面: 更高维度: 1. surface 是对平面的泛化, ...
- 用Python模拟浏览器操作
两种思绪三种要领: 用pamie.建议不要使用,因为pamie为小我私人开发,里面的bug比力多,并且是直接使用win32com体式格局的,如果ie不警惕修改了,后果很严重.另外,pamie3使用的是 ...
- ASP.NET Core 配置 MVC - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 配置 MVC - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 MVC 前面几章节中,我们都是基于 ASP.NET 空项目 ...
- windows添加本地文件托管到新增github库
新增repositoy.登录gitHub,并点击“New Reposoitory” 写入名字 之后点击“create resposity” \ 按照上图中的步骤可以完成.以下为完成步骤. 2. 在本 ...
- Fedora 30 安装 Gradle
当前的 Gradle 最新版本是5.4.1.您可以从发布页面下载所有 Gradle 版本的二进制文件和查看文档. 先决条件 Gradle 能够在所有主流操作系统上运行,只要具备 Java-JDK/JR ...
- XF 按钮控件
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...
- C++杂记:运行时类型识别(RTTI)与动态类型转换原理
运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. ...
- c# Ajax后台动态分页
创建WebPager类 public static class WebPager { public static string WebPagerAjax(string Idn, bool IsShor ...