一、原始方式

方法一:

# 使用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)的更多相关文章

  1. 高性能IO —— Reactor(反应器)模式

    讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式, 为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个 ...

  2. 高性能IO之Reactor模式

    The reactor design pattern is an event handling pattern for handling service requests delivered conc ...

  3. 高性能IO之Reactor模式(转载)

    讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式,为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个w ...

  4. Netty高性能之Reactor线程模型

    Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用 ...

  5. 一篇文章,读懂 Netty 的高性能架构之道

    原文 Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机 ...

  6. Java异步NIO框架Netty实现高性能高并发

    原文地址:http://blog.csdn.net/opengl_es/article/details/40979371?utm_source=tuicool&utm_medium=refer ...

  7. Java与Netty实现高性能高并发

    摘要: 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程 ...

  8. 从线程模型的角度看Netty的高性能

    转载:Netty(二) 从线程模型的角度看 Netty 为什么是高性能的? 传统 IO 在 Netty 以及 NIO 出现之前,我们写 IO 应用其实用的都是用 java.io.* 下所提供的包. 比 ...

  9. 一篇文章,读懂Netty的高性能架构之道

    一篇文章,读懂Netty的高性能架构之道 Netty是由JBOSS提供的一个java开源框架,是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架, ...

随机推荐

  1. C语言学习推荐《C语言参考手册(原书第5版)》下载

  2. NetCore 获取appsetting.json 文件中的配置

    1. using Microsoft.Extensions.Configuration public class HomeController : Controller { public IConfi ...

  3. vue组件间通信六种方式(完整版)

    本文总结了vue组件间通信的几种方式,如props. $emit/ $on.vuex. $parent / $children. $attrs/ $listeners和provide/inject,以 ...

  4. 使用wincc C脚本查找窗口句柄的方法

    关于窗口句柄的用法,网上可以搜到很多相关的文章,本文以windows API接口函数为例,简单介绍一下基本使用,主要包括找到此窗体,在找到的窗体写入数据,对窗体进行关闭,最大化,最小化的操作: 1.利 ...

  5. spark 源码分析之十五 -- Spark内存管理剖析

    本篇文章主要剖析Spark的内存管理体系. 在上篇文章 spark 源码分析之十四 -- broadcast 是如何实现的?中对存储相关的内容没有做过多的剖析,下面计划先剖析Spark的内存机制,进而 ...

  6. 一个超级简单的Jetty实例

    Maven: <!-- https://mvnrepository.com/artifact/org.mortbay.jetty/jetty --> <dependency> ...

  7. 人事管理系统为你解剖JSP

    人事管理系统为你解剖JSP 前言: 之前写过两篇学习JSP的博客,<Java匹马行天下之JavaWeb核心技术——JSP>https://www.cnblogs.com/zyx110/p/ ...

  8. SpringBoot第二十二篇:应用监控之Actuator

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11226397.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   很多文章都 ...

  9. [leetcode] 650. 2 Keys Keyboard (Medium)

    解法一: 暴力DFS搜索,对每一步进行复制还是粘贴的状态进行遍历. 注意剪枝的地方: 1.当前A数量大于目标数量,停止搜索 2.当前剪贴板数字大于等于A数量时,只搜索下一步为粘贴的状态. Runtim ...

  10. 三千字讲清TypeScript与React的实战技巧

    很多时候虽然我们了解了TypeScript相关的基础知识,但是这不足以保证我们在实际项目中可以灵活运用,比如现在绝大部分前端开发者的项目都是依赖于框架的,因此我们需要来讲一下React与TypeScr ...