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 Executor 、Worker Executor是两个线程池。

Boss Executor中的线程执行的任务是Boss,Worker Executor中的线程执行的任务是Worker。

每个Boss、Worker对象中都独立拥有一个Selector(这里说的独立拥有是指每个Boss、Worker对象都有一个自己的Selector,不存在共用Selector的情况)。所以也可以认为每个Boss、Worker就充当了Dispatcher角色。

Parent-Reactor

Dispatcher:Boss

Demultiplexer:Selector

Handle:ServerSocketChannel (这是Netty中的Channel,包括Pipeline的)

EventType:ACCEPT

EventHandler:交给Sub-Reactor

Dispatcher 的handle_events()方法的过程是:

1)使用Selector选择出有ACCEPT的ServerSocketChannels。

2)调用ServerSocketChannel.accept()来接收客户端的Socket连接。并为接收到的SocketChannel创建相关联的Channel(包括Pipeline、Sink等),注册给一个Worker(Sub-Reactor的Dispatcher),其实质是由这个Worker直接注册给了相关联的Selector。

这个handle_events()过程其实也是Boss任务的内容。

客户端Parent-Reactor线程模型

Dispatcher:Boss

Demultiplexer:Selector

Handle:ClientSocketChannel (这是Netty中的Channel,包括Pipeline的)

EventType:CONNECT

EventHandler:交给Sub-Reactor

Dispatcher 的handle_events()方法的过程是:

1)使用Selector选择出有CONNECT就绪的ClientSocketChannels。

    2)调用SocketChannel.finishConnect()来连接到服务端。连接成功后,注册给一个Worker(Sub-Reactor的Dispatcher),其实质是由这个Worker直接注册给了相关联的Selector。

这个handle_events()过程其实也是Boss任务的内容。

Sub-Reactor

客户端、与服务端的Sub-Reactor实现是一样的:

Dispatcher:Worker

Demultiplexer:Selector

Handle:SocketChannel(这是Netty中的Channel)

EventType:READ、WRITE

EventHandler:读写操作

Dispatcher的handle_events()方法的过程是:

1)  使用Selector取出有事件的SocketChannels

2)  遍历SocketChannel,进行读写操作。

读操作执行后,会进入ChannelPipeline中进行处理。在运行过程中的写事件会存储在Channel相关的Queue中等待IOWorker执行写操作。

IO Worker线程的执行逻辑

除了 5、6之外,其它的都是在IOWorker关联的线程中执行的。

了解 Netty的线程模型,对于正确合理使用Netty有很大的帮助。

时间: 2024-10-13 07:54:25

Netty:Netty 3.x 线程模型的相关文章

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

引言 不同的线程模型对程序的性能有很大的影响,Netty是建立在Reactor模型的基础上,要搞清Netty的线程模型,需要了解一目前常见线程模型的一些概念. 具体是进程还是线程,是和平台或者编程语言相关,本文为了描述方便,以线程描述. 目前存在的线程模型有: 传统阻塞IO服务模型 Reactor模型 Proactor模型 1.传统阻塞IO服务模型 采用阻塞IO模型获取输入的数据. 每个连接需要独立的完成数据的输入,业务的处理,数据返回. 当并发数大的时候,会创建大量的线程,占用系统资源,如果连

Netty版本升级血泪史之线程篇

1. 背景 1.1. Netty 3.X系列版本现状 根据对Netty社区部分用户的调查,结合Netty在其它开源项目中的使用情况,我们可以看出目前Netty商用的主流版本集中在3.X和4.X上,其中以Netty 3.X系列版本使用最为广泛. Netty社区非常活跃,3.X系列版本从2011年2月7日发布的netty-3.2.4 Final版本到2014年12月17日发布的netty-3.10.0 Final版本,版本跨度达3年多,期间共推出了61个Final版本. 1.2. 升级还是坚守老版本

Vert.x 线程模型揭秘

来源:鸟窝, colobu.com/2016/03/31/vertx-thread-model/ 如有好文章投稿,请点击 → 这里了解详情 Vert.x是一个在JVM开发reactive应用的框架,可用于开发异步.可伸缩.高并发的Web应用(虽然不限于web应用).其目的在于为JVM提供一个Node.js的替代方案.开发者可以通过它使用JavaScript.Ruby.Groovy.Java,甚至是混合语言来编写应用. 使用Vertx.x框架,可以用JavaScript.CoffeeScript.

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的线程模型

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

Netty 线程模型

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

Netty IO线程模型学习总结

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

Mina、Netty、Twisted一起学(十):线程模型

要想开发一个高性能的TCPserver,熟悉所使用框架的线程模型非常重要.MINA.Netty.Twisted本身都是高性能的网络框架,假设再搭配上高效率的代码.才干实现一个高大上的server. 可是假设不了解它们的线程模型.就非常难写出高性能的代码.框架本身效率再高.程序写的太差,那么server总体的性能也不会太高.就像一个电脑,CPU再好.内存小硬盘慢散热差,总体的性能也不会太高. 玩过Android开发的同学会知道,在Android应用中有一个非常重要线程:UI线程(即主线程). UI