Netty高性能模式学习笔记

一、线程基本模型

1.1 传统阻塞IO服务模型

特点

  1. 采用阻塞IO模型获取输入的数据
  2. 每个连接都需要独立的线程完成数据的输入,业务处理,数据返回

问题

  1. 当并发数很大,会创建大量的线程,占用很大的系统资源
  2. 连接创建后,如果当前线程暂时没有数据可读,该现场会阻塞在read操作,造成线程资源浪费

二、Reactor 模型

2.1 IO复用结合线程池

  1. Reactor模式,通过一个或多个输入同时传递给服务器处理器的模式(基于事件驱动)
  2. 服务器端程序处理传入的多个请求,并讲它们同步分派到相对应的处理线程,Reactor模式也叫Dispatcher模式
  3. Reactor模式使用IO复用监听事件,收到时间后分发给某个线程(进程)这也是高并发处理的关键

在这里插入图片描述

2.2 Reactor 模型中 核心组成

  1. Reactor: 接线员,复制监听和分发事件,分派给适当的处理程序来对IO事件做出反应
  2. Handler:处理程序执行IO事件要完成的实际事件

2.3 Reactor模式分类

  1. 单 Reactor单线程
  2. 单 Reactor 多线程
  3. 主从Reactor 多线程

2.4 单Reactor单线程

在这里插入图片描述
过程

(1)Select通过一个阻塞对象监听多路连接请求
(2) Reactor对象通过Select监控客户端请求事件,收到事件后通过Dispatch进行分发
(3)如果是建立连接事件,则由Acceptor通过Accept处理连接请求,然后创建Handler对象处理连接请求完成后的后续业务处理
(4)如果不是连接事件,则Reactor会分发调用连接对应Handler来响应
(5)Handler 会完成Read——业务处理——send 的完整业务流程

问题
只有一个线程,无法完全发挥多核CPU的性能。Handler在处理某个连接上业务时,整个进程无法处理其他连接事件。

2.5 单Reactor单多程在这里插入图片描述

过程

(1)Select通过一个阻塞对象监听多路连接请求
(2) Reactor对象通过Select监控客户端请求事件,收到事件后通过Dispatch进行分发
(3)如果是建立连接事件,则由Acceptor通过Accept处理连接请求,然后创建Handler对象处理连接请求完成后的后续业务处理
(4)如果不是连接事件,则Reactor会分发调用连接对应Handler来响应
(5)Handler 只负责响应事件,不做具体的业务处理,通过read读取数据之后会分给后面的worker线程池的某个线程处理业务
(6)Worker线程池中有很多个线程负责具体的业务处理,并讲结果返回给handler
(7)handler收到响应后,通过send将结果返回给client

缺点
多线程数据共享和访问比较复杂,reactor处理所有的时间监听和响应,在单线程运行,在高并发场景容易出现性能瓶颈

2.6主从Reactor 多线程

在这里插入图片描述

(1)Reactor 主线程MainReactor 对象通过select监听连接事件,收到事件后,通过Acceptor处理连接事件
(2)当Acceptor 处理连接事件后,MainReactor将连接分配给SubReactor
(3) SubReactor 将连接假如到连接队列进行监听,并创建handler进行各种事件处理
(4)当有新事件发生时,subreactor 就会调用对应handler进行各种事件处理
(5)handler通过read读取数据,分发给后面的worker线程处理
(6)worker线程池分配独立的worker线程业务处理,并返回结果
(7)handler收到响应的结果后,再通过send返回给client
(8)Reactor主线程可以对应多个Reactor子线程,即MainReactor可以关联多个SubReactor

三、Netty模型

在这里插入图片描述
(1)Netty抽象出两组线程池BossGroup和WorkerGroup,BossGroup专门负责接收客户端的链接,WorkerGroup专门负责网络的读写
(2)BossGroup和WorkerGroup类型都是NioEventLoopGroup
(3)NioEventLoopGroup相当于一个事件循环组,这个组中含有多个事件循环,每一个事件循环是NioEventLoop
(4)NioEventLoop表示一个不断循环的执行处理任务的线程,每个NioEventLoop都有一个Selector,用于监听绑定在其上的socket的网络通讯
(5)NioEventLoopGroup可以有多个线程,即含有多个NioEventLoop
(6) 每一个Boss NioEventLoop循环执行的步骤有3步

  1. 轮询accept事件
  2. 处理accept事件,与client建立连接,生成NioSocketChannel,并将其注册到某个worker NIOEventLoop 上的selector
  3. 处理任务队列的任务,即runAllTasks
    (7)每个workerNIOEventLoop循环执行的步骤
  4. 轮询read,write事件,在对应NioSocketChannel处理
  5. 处理任务队列的任务,即润AllTasks
    (8)每个WorkerNIOEventLoop处理业务时,会使用pipeline(管道),pipeline中包含了channel,可以获得到对应的通道,并且通道中维护了很多处理器。

猜你喜欢

转载自blog.csdn.net/qq_43263481/article/details/109523900