004——Netty之高性能IO(Reactor)
一、原始方式
方法一:
# 使用while循环,不断监听端口是否有新的套接字链接
while(true){
socket = accept();
handle(socket)
}
# 做法局限:处理效率低下,并发是请求只能阻塞
方法二:
# 一个连接对应一个线程
while(true){
socket = accept();
new thread(socket);
}
# 每个线程阻塞不会影响到后续请求,但对资源要求非常高。线程粒度大,每个线程一次性处理所有交互事情(连接、读取和写入),限制了吞吐量。
方法三:
# 将线程粒度减小。将一次连接的操作划分为更细的粒度或者过程。这样虽然线程数量变多,但是处理的事情更为简单和单一
二、Reactor定义
关键点
事件驱动(event handling)
可以处理一个或多个输入源(one or more inputs)
通过Service Handler同步的将输入事件(Event)采用多路复用分发给对应Handler处理
处理流程
- 同步的等待多个事件源到达(采用select()实现)
- 将事件多路分解以及分配相应的事件服务进行处理,这个分派采用server集中处理(dispatch)
- 分解的事件以及对应的事件服务应用从分派服务中分离出去(handler)
使用Reactor的原因
NIO的优点:
- 基于事件驱动(selector支持对多个Channel进行监听)
- 统一事件处理分派中心(dispatch)
- 事件处理服务
不足
- 更少的开销,更少的上下文切换以及locking
- 能够跟踪服务器状态
- 能够管理handler 对event的绑定
三、Reactor模式
介绍
Reactor将被拆分的子过程对应到Handler上,每一种handler会处理一种event。Selector全局管理进行全局管理。我们只需要注册感兴趣的channel事件,selector就会通过轮询的方式不断检测channel上的事件是否发生。如果没有事件发生则线程阻塞,如果时间发生,则调用相应handler进行处理。
非Reactor模型

- 这种模型由于IO在阻塞时会一直等待,因此在用户负载增加时,性能下降的非常快
- serversocket的accept方法,阻塞等待client连接,直到client连接成功
- 线程从socket inputstream读入数据,会进入阻塞状态,直到全部数据读完
- 线程向socket outputstream写入数据,会阻塞直到全部数据写完
Reactor模型
- Reactor 将I/O事件分派给对应的Handler
- Acceptor 处理客户端新连接,并分派请求到处理器链中
- Handlers 执行非阻塞读/写任务,Event绑定
单Reactor单线程模型
改进点:基于事件模式,当事件触发时,才调用处理器进行处理

- 当新连接到来触发connect事件之后,交由Acceptor进行处理,并构造Handler
- 有IO读写事件之后交给Hanlder处理。
- 在获取到Client相关的SocketChannel之后,绑定到相应Handler上。
- 若是连接事件获取是acceptor,若是IO读写事件获取是handler。都由Reactor进行分发
Acceptor主要任务就是构建handler ,在获取到和client相关的SocketChannel之后 ,绑定到相应的hanlder上,对应的SocketChannel有读写事件之后,基于racotor 分发,hanlder就可以处理了(所有的IO事件都绑定到selector上,有Reactor分发)。
单Reactor多线程模型
改进:使用多线程处理业务逻辑。

- 专门一个IO线程——Acceptor线程负责监听服务端请求。
- 消息读取、解码、编码、发送由线程池负责
- 一个链路只对应一个线程,可以避免同步操作。
- Reacpter只负责消息分发
多Reactor多线程模型

- mainReactor负责监听 ServerSocketChannel ,用来处理客户端新连接的建立,并将建立的客户端的SocketChannel指定注册给 subReactor 。
- subReactor 维护自己的 Selector ,基于 mainReactor 建立的客户端的 SocketChannel 多路分离 IO 读写事件,读写网络数据。对于业务处理的功能,另外扔给 worker 线程池来完成。
- 该模式为Netty默认模式
https://blog.csdn.net/qq_24313635/article/details/80989450
004——Netty之高性能IO(Reactor)的更多相关文章
- 高性能IO —— Reactor(反应器)模式
讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式, 为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个 ...
- 高性能IO之Reactor模式
The reactor design pattern is an event handling pattern for handling service requests delivered conc ...
- 高性能IO之Reactor模式(转载)
讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式,为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个w ...
- Netty高性能之Reactor线程模型
Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用 ...
- 一篇文章,读懂 Netty 的高性能架构之道
原文 Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机 ...
- Java异步NIO框架Netty实现高性能高并发
原文地址:http://blog.csdn.net/opengl_es/article/details/40979371?utm_source=tuicool&utm_medium=refer ...
- Java与Netty实现高性能高并发
摘要: 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程 ...
- 从线程模型的角度看Netty的高性能
转载:Netty(二) 从线程模型的角度看 Netty 为什么是高性能的? 传统 IO 在 Netty 以及 NIO 出现之前,我们写 IO 应用其实用的都是用 java.io.* 下所提供的包. 比 ...
- 一篇文章,读懂Netty的高性能架构之道
一篇文章,读懂Netty的高性能架构之道 Netty是由JBOSS提供的一个java开源框架,是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架, ...
随机推荐
- Perm排列计数(新博客试水,写的不好,各路大神见谅)
B. Perm 排列计数 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i&l ...
- 关于CMTS设备的一些备忘
博主工作内容包括cable modem,对CM的工作方式有一些了解,但是对CMTS头端怎么带动一个用户小区长久以来一直是一头雾水.今天找了些资料,对这块有了一些了解,并把自己的理解总结下来. 比如我家 ...
- getlasterror() 输出错误信息,
得自http://bbs.csdn.net/topics/390416234 LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE ...
- Android总结之打开手机相册获取图片
上一篇,总结了如何打开照相机获取图片,详情请看>>>> 这篇将总结如何打开手机存储(相册)来获取手机上的图片. 打开相册 在需要这个功能的类中,我们可以自定义一个方法openA ...
- python课堂整理16---内置函数
1. abs :求绝对值 print(abs(-1)) 2. all()传入一个可迭代对象,对该对象进行bool值运算,若都为True 就返回True,有一个为假,就返回False print(all ...
- 极简代码神器:Lombok使用教程
Lombok 是一个非常神奇的 java 类库,会利用注解自动生成 java Bean 中烦人的 Getter.Setter,还能自动生成 logger.ToString.HashCode.Build ...
- 【iOS】代码片段库
若在某个 Objective-C 的实现文件中输入 init,Xcode 会自动列出一系列备选项,如图所示: Xcode 自动加入的这段代码源自代码片段库(code snippet library), ...
- 常用GDB命令行调试命令
po po是print-object的简写,可用来打印所有NSObject对象.使用举例如下: (gdb) po self <LauncherViewController: 0x552c570& ...
- Asp.Net MVC SingleServiceResolver类剖析
SingleServiceResolver一般用于类工厂创建和注入点接口留白.类工厂创建比如Controller控制依赖于此类的创建,注入点留白实质上是依赖注入所对外预留的接口. 以第二个特性为例. ...
- 调试过程中发现按f5无法走进jdk源码
debug 模式 ,在fis=new FileInputStream(file); 行打断点 调试过程中发现按f5无法走进jdk源码 package com.lzl.spring.test; impo ...