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框架, ...
随机推荐
- C语言学习推荐《C语言参考手册(原书第5版)》下载
- NetCore 获取appsetting.json 文件中的配置
1. using Microsoft.Extensions.Configuration public class HomeController : Controller { public IConfi ...
- vue组件间通信六种方式(完整版)
本文总结了vue组件间通信的几种方式,如props. $emit/ $on.vuex. $parent / $children. $attrs/ $listeners和provide/inject,以 ...
- 使用wincc C脚本查找窗口句柄的方法
关于窗口句柄的用法,网上可以搜到很多相关的文章,本文以windows API接口函数为例,简单介绍一下基本使用,主要包括找到此窗体,在找到的窗体写入数据,对窗体进行关闭,最大化,最小化的操作: 1.利 ...
- spark 源码分析之十五 -- Spark内存管理剖析
本篇文章主要剖析Spark的内存管理体系. 在上篇文章 spark 源码分析之十四 -- broadcast 是如何实现的?中对存储相关的内容没有做过多的剖析,下面计划先剖析Spark的内存机制,进而 ...
- 一个超级简单的Jetty实例
Maven: <!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jetty --> <dependency> ...
- 人事管理系统为你解剖JSP
人事管理系统为你解剖JSP 前言: 之前写过两篇学习JSP的博客,<Java匹马行天下之JavaWeb核心技术——JSP>https://www.cnblogs.com/zyx110/p/ ...
- SpringBoot第二十二篇:应用监控之Actuator
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11226397.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 很多文章都 ...
- [leetcode] 650. 2 Keys Keyboard (Medium)
解法一: 暴力DFS搜索,对每一步进行复制还是粘贴的状态进行遍历. 注意剪枝的地方: 1.当前A数量大于目标数量,停止搜索 2.当前剪贴板数字大于等于A数量时,只搜索下一步为粘贴的状态. Runtim ...
- 三千字讲清TypeScript与React的实战技巧
很多时候虽然我们了解了TypeScript相关的基础知识,但是这不足以保证我们在实际项目中可以灵活运用,比如现在绝大部分前端开发者的项目都是依赖于框架的,因此我们需要来讲一下React与TypeScr ...