深入了解Netty【五】线程模型


引言

不同的线程模型对程序的性能有很大的影响,Netty是建立在Reactor模型的基础上,要搞清Netty的线程模型,需要了解一目前常见线程模型的一些概念。
具体是进程还是线程,是和平台或者编程语言相关,本文为了描述方便,以线程描述。
目前存在的线程模型有:

  • 传统阻塞IO服务模型
  • Reactor模型
  • Proactor模型

1、传统阻塞IO服务模型

采用阻塞IO模型获取输入的数据。 每个连接需要独立的完成数据的输入,业务的处理,数据返回。
当并发数大的时候,会创建大量的线程,占用系统资源,如果连接创建后,当前线程没有数据可读,会阻塞,造成线程资源浪费。

2、Reactor模型

IO多路复用 线程池 = Reactor模型

根据Reactor的数量和处理线程的数量,Reactor模型分为三类:

  • 单Reactor单线程
  • 单Reactor多线程
  • 主从Reactor多线程

下面分别描述。

2.1、单Reactor单线程


图中:

  • Reactor中的select模块就是IO多路复用模型中的选择器,可以通过一个阻塞对象监听多路连接请求。
  • Reactor对象通过Select监控客户端请求事件,收到事件后,通过Dispatch进行分发。
  • 如果是建立连接事件,则用Acceptor通过Accept处理连接请求,然后创建一个Handler对象,处理连接完成后的业务处理。
  • 如果不是建立连接事件,则Reactor会分发调用连接对应的Handler处理。
  • Handler会处理Read-业务-Send流程。

这种模型,在客户端数量过多时,会无法支撑。因为只有一个线程,无法发挥多核CPU性能,且Handler处理某个连接的业务时,服务端无法处理其他连接事件。
以前在学习Redis原理的时候,发现它内部就是这种模型:深入了解Redis【十二】Reactor事件模型在Redis中的应用

2.2、单Reactor多线程

图中多线程体现在两个部分:

  • Reactor主线程
    Reactor通过select监听客户请求,如果是连接请求事件,则由Acceptor处理连接,如果是其他请求,则由dispatch找到对应的Handler,这里的Handler只负责响应事件,读取和响应,会将具体的业务处理交由Worker线程池处理。
  • Worker线程池
    Worker线程池会分配独立线程完成真正的业务,并将结果返回给Handler,Handler收到响应后,通过send将结果返回给客户端。

这里Reactor处理所有的事件监听和响应,高并发情景下容易出现性能瓶颈。

2.3、主从Reactor多线程

这种模式是对单Reactor的改进,由原来单Reactor改成了Reactor主线程与Reactor子线程。

  • Reactor主线程的MainReactor对象通过select监听连接事件,收到事件后,通过Acceptor处理连接事件。
  • 当Acceptor处理完连接事件之后,MainReactor将连接分配给SubReactor。
  • SubReactor将连接加入到连接队列进行监听,并创建handler进行事件处理。
  • 当有新的事件发生时,SubReactor就会调用对应的handler处理。
  • handler通过read读取数据,交由Worker线程池处理业务。
  • Worker线程池分配线程处理完数据后,将结果返回给handler。
  • handler收到返回的数据后,通过send将结果返回给客户端。
  • MainReactor可以对应多个SubReactor。

这种优点多多,各个模块各司其职,缺点就是实现复杂。

3、Proactor模型

Proactor模型在理论上是比Reactor模型性能更好,但是因为依赖于操作系统的非阻塞异步模型,而linux的非阻塞异步模型还不完善,所以还是以Reactor为主。

总结

在学习这一部分知识的时候,想到redis中Reactor的应用,又想到了以前分析Tomcat源码时,其内部就是这种Reactor的思想。
突然感觉被我发现了一个天大的秘密:技术原理是通用的!

参考

Netty 系列之 Netty 线程模型
理解高性能网络模型

原文地址:https://www.cnblogs.com/clawhub/p/11967383.html

时间: 2024-10-13 09:14:07

深入了解Netty【五】线程模型的相关文章

Netty IO线程模型学习总结

Netty框架的 主要线程是IO线程,线程模型的好坏直接决定了系统的吞吐量.并发性和安全性. Netty的线程模型遵循了Reactor的基础线程模型.下面我们先一起看下该模型 Reactor线程模型 Reactor 单线程模型 单线程模型中所有的IO操作都在一个NIO线程上操作: 包含接受客户端的请求,读取客户端的消息和应答.由于使用的是异步非阻塞的IO,所有的IO操作不会阻塞,理论上一个线程就可以处理所有的IO操作. 单线程模型适用小容量的应用.因为在高并发应用 可导致以下问题 一个线程同时处

Netty服务器线程模型概览

一切从ServerBootstrap开始ServerBootstrap 负责初始话netty服务器,并且开始监听端口的socket请求. bootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(),//boss线程池 Executors.newCachedThreadPool()//worker线程池 ) ); bootstrap.set

Netty的线程模型

当我们讨论Netty线程模型的时候,一般首先会想到的是经典的Reactor线程模型,尽管不同的NIO框架对于Reactor模式的实现存在差异,但本质上还是遵循了Reactor的基础线程模型.下面浅谈一下我对Reactor线程模型的认识 1.Reactor单线程模型,是指所有的I/O操作都在同一个NIO线程上面完成.NIO线程的职责如下 作为NIO服务端,接收客户端的TCP连接 作为NIO客户端,向服务端发起TCP连接 读取通信对端的请求或者应答消息 向通信对端发送消息请求或者应答消息 对于小容量

Netty线程模型

一.Reactor模型 1.单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个NIO线程上面完成,NIO线程的职责如下: 1)作为NIO服务端,接收客户端的TCP连接: 2)作为NIO客户端,向服务端发起TCP连接: 3)读取通信对端的请求或者应答消息: 4)向通信对端发送消息请求或者应答消息 Reactor单线程模型示意图如下所示: 由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作.从架构层面看,一个NI

Netty系列之Netty线程模型

1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比较流行的是单线程编程,对于CPU密集型的应用程序而言,频繁的通过多线程进行协作和抢占时间片反而会降低性能. 1.1.2. 多线程 随着硬件性能的提升,CPU的核数越来越越多,很多服务器标配已经达到32或64核.通过多线程并发编程,可以充分利用多核CPU的处理能力,提升系统的处理效率和并发性能. 相关

【转】netty线程模型

Netty服务器线程模型概览 博客分类: netty java 一切从ServerBootstrap开始 ServerBootstrap 负责初始话netty服务器,并且开始监听端口的socket请求. Java代码   bootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(),//boss线程池 Executors.newCached

Netty 线程模型

关于Java NIO Reactor模式http://my.oschina.net/xinxingegeya/blog/339027 下面是线程模型的演进 Thread per Connection Thread per Connection: 在没有nio之前,这是传统的java网络编程方案所采用的线程模型.即有一个主循环,socket.accept阻塞等待,当建立连接后,创建新的线程/从线程池中取一个,把该socket连接交由新线程全权处理.这种方案优缺点都很明显,优点即实现简单,缺点则是方

Netty:Netty 3.x 线程模型

众所周知,Netty使用了主从Reactor模式来完成CONNECT.ACCEPT.READ.WRITE操作.所以这里就从Reactor角度来分析一下Netty3的线程模型. Parent-Reactor 服务端Parent-Reactor设计 客户端Parent-Reactor设计 Sub-Reactor IO Worker设计 Parent-Reactor 服务端Parent-Reactor设计 在了解了Netty 3的源码后,对它的服务端的线程模型做了简单的总结 : Boss Execut

Netty in Action (十七) 第七章节 EventLoop和线程模型

本章节包括: 1)线程模型总览 2)Event Loop概念和具体实现 3)任务调度 4)实现细节 简单地陈述一下,对于一个操作系统,编程语言,框架,或者应用来说,线程模型对其都是至关重要的一部分,在什么时间如何创建一个线程都会对你的代码执行有很重要的影响,所以对于开发人员而言,懂得在各种线程模型里面权衡利弊就是一个很重要的事情,是直接使用线程模型本身还是通过一些框架或者语言提供的线程框架对于开发者而言都是需要选择的 在这个章节,我们将会详细地讲解Netty的线程模型,这个模型是很强大的,且易于