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线程 我们已经了解 ...
随机推荐
- OpenSSL 使用 base64 编码/解码(liang19890820)
关于 OpenSSL 的介绍及安装请参见:Windows 下编译 OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #inclu ...
- iOS开展block说明
源代码下载 浅谈block使用方法 对于block他用着确实方便,好多人都非常迷茫,这里写了一个Demo解说block的使用方法 好多人都觉得block是用于后一个界面向前一个界面传值用的,事实上更详 ...
- HDU 4861(多校)1001 Couple doubi
Problem Description DouBiXp has a girlfriend named DouBiNan.One day they felt very boring and decide ...
- Python抓取小说
Python抓取小说 前言 这个脚本命令MAC在抓取小说写,使用Python它有几个码. 代码 # coding=utf-8 import re import urllib2 import chard ...
- 一个RPC的demo (good)
从下面的例子中可以看到,Consumer(client)的代码中引用了Provider部分的class,本例中是 com.provider.EchoServiceImpl和com.provider.E ...
- IOS开发之KVC KVO KVB
KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...
- SICP 1.11-1.13
1.11 递归版本 (define (f n) (cond ((< n ) n) ()) (* (f (- n )) ) (* (f (- n )) ))))) 迭代版本 (define (f ...
- 通通玩blend美工(7)——简约而不简单的块
原文:通通玩blend美工(7)--简约而不简单的块 最近在研发一个WPF快速开发框架,满脑子都是各种逻辑各种模式,写一篇比较休闲娱乐的博客,宣泄下我对美工的热爱. 我一直以来有意无意在手机应用或者各 ...
- js 注册事件
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- 调用API函数减少c#内存占用(20+m减至1m以下)
原文:调用API函数减少c#内存占用(20+m减至1m以下) c#虽然内置垃圾回收机制,但是并不能解决程序占用内存庞大的问题,如果我们仔细观察任务管理器,我们会发现一个程序如果最小化的时候,它所占用的 ...