精华内容
下载资源
问答
  • netty 线程模型

    2019-02-25 18:30:34
    这是一本详细介绍了netty线程模型的书籍,包括 nio核心
  • Netty线程模型

    万次阅读 2020-07-12 23:32:48
    Netty线程模型Netty解决的问题Netty的使用场景Netty线程模型ByteBuf详解 Netty解决的问题 NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握Selector、 ServerSocketChannel、 SocketChannel、 ByteBuffer等。 开发...

    Netty解决的问题

    • NIO 的类库和 API 繁杂, 使用麻烦: 需要熟练掌握Selector、 ServerSocketChannel、
      SocketChannel、 ByteBuffer等。
    • 开发工作量和难度都非常大: 例如客户端面临断连重连、 网络闪断、心跳处理、半包读写、 网络拥塞 和异常流的处理等等。
    • Netty 对 JDK 自带的 NIO 的 API 进行了良好的封装,解决了上述问题。且Netty拥有高性能、 吞吐 量更高,延迟更低,减少资源消耗,最小化不必要的内存复制等优点。
    • Netty 现在都在用的是4.x,5.x版本已经废弃,Netty 4.x 需要JDK 6以上版本支持

    Netty的使用场景

    1. 互联网行业:在分布式系统中,各个节点之间需要远程服务调用,高性能的 RPC 框架必不可少, Netty 作为异步高性能的通信框架,往往作为基础通信组件被这些 RPC 框架使用。典型的应用有:阿 里分布式服务框架 Dubbo 的 RPC 框架使用 Dubbo 协议进行节点间通信,Dubbo 协议默认使用 Netty 作为基础通信组件,用于实现。各进程节点之间的内部通信。Rocketmq底层也是用的Netty作 为基础通信组件。
    2. 游戏行业:无论是手游服务端还是大型的网络游戏,Java 语言得到了越来越广泛的应用。Netty 作为高性能的基础通信组件,它本身提供了 TCP/UDP 和 HTTP 协议栈。
    3. 大数据领域:经典的 Hadoop 的高性能通信和序列化组件 Avro 的 RPC 框架,默认采用 Netty 进行跨界点通信,它的 Netty Service 基于 Netty 框架二次封装实现。 netty相关开源项目:https://netty.io/wiki/related-projects.html

    Netty线程模型

    在这里插入图片描述
    模型解释

    1. Netty 抽象出两组线程池BossGroup和WorkerGroup,BossGroup专门负责接收客户端的连接, WorkerGroup专门负责网络的读写
    2. BossGroup和WorkerGroup类型都是NioEventLoopGroup
    3. NioEventLoopGroup 相当于一个事件循环线程组, 这个组中含有多个事件循环线程 , 每一个事件 循环线程是NioEventLoop
    4. 每个NioEventLoop都有一个selector , 用于监听注册在其上的socketChannel的网络通讯
    5. 每个Boss NioEventLoop线程内部循环执行的步骤有3 步:
      • 处理accept事件 , 与client 建立连接 , 生成 NioSocketChannel
      • 将NioSocketChannel注册到某个worker NIOEventLoop上的selector
      • 处理任务队列的任务 , 即runAllTasks
    6. 每个worker NIOEventLoop线程循环执行的步骤
      • 轮询注册到自己selector上的所有NioSocketChannel 的read, write事件
      • 处理 I/O 事件, 即read , write 事件, 在对应NioSocketChannel 处理业务
      • runAllTasks处理任务队列TaskQueue的任务 ,一些耗时的业务处理一般可以放入
        TaskQueue中慢慢处理,这样不影响数据在 pipeline 中的流动处理
    7. 每个worker NIOEventLoop处理NioSocketChannel业务时,会使用 pipeline (管道),管道中维护 了很多 handler 处理器用来处理 channel 中的数据

    ByteBuf详解

    从结构上来说,ByteBuf 由一串字节数组构成。数组中每个字节用来存放信息。
    ByteBuf 提供了两个索引,一个用于读取数据,一个用于写入数据。这两个索引通过在字节数 组中移动,来定位需要读或者写信息的位置。
    当从 ByteBuf 读取时,它的 readerIndex(读索引)将会根据读取的字节数递增。 同样,当写 ByteBuf 时,它的 writerIndex 也会根据写入的字节数进行递增。
    在这里插入图片描述
    需要注意的是极限的情况是 readerIndex 刚好读到了 writerIndex 写入的地方。
    如果 readerIndex 超过了 writerIndex 的时候,Netty 会抛出 IndexOutOf-BoundsException 异常。

    展开全文
  • Netty 线程模型

    2021-01-31 20:53:55
    其实 Netty 线程模型是基于主从 Reactor 多线程模型做了一定的改造,Netty线程模型要比 Reactor 主从多线程模型还要复杂。本节主要是通过图解的方式逐步分析 Netty 线程模型的原理。 2. Netty 模型介绍 2.1...

    1. 前言

    前面几节分别讲解了 Reactor 的三种线程模型,都知道主从 Reactor 多线程模型的性能非常的好,那么 Netty 是否就是使用主从 Reactor 多线程模型呢?其实 Netty 线程模型是基于主从 Reactor 多线程模型做了一定的改造,Netty 的线程模型要比 Reactor 主从多线程模型还要复杂。本节主要是通过图解的方式逐步分析 Netty 线程模型的原理。

    2. Netty 模型介绍

    2.1 模型介绍

    图片描述

    Netty 模型架构说明:

    1. Netty 抽象出两个线程池,分别是 BossGroup 和 WorkerGroup,BossGroup 专门负责接受客户端的连接,Worker 请求处理;
    2. BossGroup 和 WorkerGroup 类型默认使用的是 NioEventLoopGroup;
    3. NioEventLoopGroup 是一个定时任务线程池,NioEventLoop 是真正工作的线程;
    4. 每个 BossGroup 的 NioEventLoop 分别循环执行三个步骤
      4.1 每个 NioEventLoop 都有一个 Selector,并且不断轮询 accept 事件;
      4.2 处理 accept 事件,与客户端建立连接,生成 NioSocketChannel,并且将其注册到某个 WorkerGroup 下的 NioEventLoop 上的 Selector 上;
      4.3 处理任务队列中的任务,即 runAllTasks。
    5. 每个 WorkerGroup 的 NioEventLoop 分别循环执行三个步骤
      5.1 轮询 read 和 write 事件;
      5.2 处理 I/O 事件,即 read,write 事件,并在其对应的 NioSocketChannel 处理;
      5.3 处理任务队列的任务,即 runAllTasks。

    2.2 核心概念理解

    Tips: 额外知识点补充,这里提前剧透一下 Channel、ChannelPipeline、ChannelHanlder 之间的关系

    1. 每个客户端连接进来的时候,服务端都会建立一个 Channel;
    2. 为每个 Channel 绑定一个 NioEventLoop 线程,该线程主要负责处理该 Channel 的业务,一个 Channel 对应一个 NioEventLoop,但是一个 NioEventLoop 可以同时服务多个 Channel;
    3. 为每个 Channel 绑定一个 ChannelPipeline,它是一个业务管道,专门负责管理业务链,也就是 ChannelHandler;
    4. WorkerGroup 的核心方法是 runAllTasks (),它主要是触发 NioEventLoop 去处理对应的 Channel 里面的 ChannelPipeline 里面的 ChannelHandler 里面的业务逻辑。

    3. Netty 模型配置

    3.1 单线程配置

    在 ServerBootstrap 调用方法 group 的时候,传递的参数是同一个线程组,且在构造线程组的时候,构造参数为 1。

    实例:

    public class ServerNetty{
        private ServerBootstrap bootstrap=null;
        private EventLoopGroup group=null;
        public void init(){
            group=new NioEventLoopGroup(1);//线程数量为 1
            bootstrap.group(group,group);
        }
    }
    

     

    3.2 多线程配置

    在 ServerBootstrap 调用方法 group 的时候,传递的参数是两个不同的线程组,负责监听的 acceptor 线程组的线程数为 1,负责处理客户端线程组的线程数大于 1。

    实例:

    public class ServerNetty{
        private ServerBootstrap bootstrap=null;
        private EventLoopGroup acceptorGroup=null;
        private EventLoopGroup clientGroup=null;
        public void init(){
            acceptorGroup=new NioEventLoopGroup(1);//线程数量为 1
            clientGroup=new NioEventLoopGroup();//默认是 cpu 的核心数
            bootstrap.group(acceptorGroup,clientGroup);
        }
    }
    

     

    3.3 主从多线程配置

    在 ServerBootstrap 调用方法 group 的时候,传递的参数是两个不同的线程组,负责监听的 acceptor 线程组的线程数大于 1,负责处理客户端线程组的线程数大于 1。

    实例:

     

    4. 自定义任务队列

    通常情况下,任务队列中常见的任务主要有以下几种类型:

    1. 用户自定义的异步任务,比如:依赖线程池去异步某个任务等;
    2. 用户自定义的定时任务,比如:依赖定时线程池去定义每隔 n 秒执行某个任务等;
    3. 非当前 reactor 线程调用 channel 的各种方法。

    4.1 异步任务

    其实跟我们平时使用线程池没有什么区别,只不过调用的是底层 Netty 线程组。

    实例:

    //使用 reactor 线程的异步任务
    ctx.channel().eventLoop().execute(new Runnable() {
        @Override
        public void run() {
            //...
        }
    });
    
    //使用线程池去实现异步任务
    ExecutorService es = Executors.newFixedThreadPool(5);
    es.execute(new Runnable() {
        @Override
        public void run() {
            
        }
    });
    

     

    4.2 定时任务

    其实类似我们平时使用的定时任务线程池(如:ScheduledThreadPool),只不过是调用底层 Netty 线程组。

    实例:

    //使用 reactor 线程实现的定时任务
    ctx.channel().eventLoop().schedule(new Runnable() {
        @Override
        public void run() {
    
        }
    }, 60, TimeUnit.SECONDS);
    
    //使用线程池去实现定时任务
    ScheduledExecutorService ses = Executors.newScheduledThreadPool(5);
    ses.schedule(new Runnable() {
        public void run() {
            System.out.println("i:" + temp);
        }
    }, 3, TimeUnit.SECONDS);
    

     

    总结:

    1. 当前 reactor 线程调用当前 eventLoop 执行任务,直接执行,否则,添加到任务队列稍后执行;
    2. netty 内部的任务分为普通任务和定时任务,分别落地到 MpscQueue 和 PriorityQueue;
    3. netty 每次执行任务循环之前,会将已经到期的定时任务从 PriorityQueue 转移到 MpscQueue;
    4. netty 每隔 64 个任务检查一下是否该退出任务循环。

    5. 小结

    本节主要掌握的核心知识点

    1. Netty 的模型的理解,以及每个 NioEventLoop 所执行的三个核心操作,分别是①轮询出 IO 事件;②处理 IO 事件;③处理任务队列;
    2. 了解 Channel、ChannelPipeline、ChannelHandler 之间的关系,以及 NioEventLoop 主要负责处理每个 Channel 的业务逻辑;
    3. Netty 如何配置三种 Reactor 模型;
    4. 如何使用内置的 NioEventLoop 执行自定义的异步任务和定时任务。
    展开全文
  • netty线程模型

    2020-10-21 16:25:32
    Netty 线程模式(Netty 主要基于主从 Reactor 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor) 一:传统阻塞 I/O 服务模型 工作原理图 黄色的框表示对象, 蓝色的框表示线程 白色的框表示...

    1:目前存在的线程模型有:

    • 传统阻塞 I/O 服务模型
    • Reactor 模式

    2:根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现

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

    Netty 线程模式(Netty 主要基于主从 Reactor 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor)

    一:传统阻塞 I/O 服务模型

    工作原理图
    • 黄色的框表示对象, 蓝色的框表示线程
    • 白色的框表示方法(API)
      在这里插入图片描述
    模型特点

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

    问题分析

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

    针对传统阻塞 I/O 服务模型的 2 个缺点,解决方案:
    • 基于 I/O 复用模型:多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理 Reactor 对应的叫法: 1. 反应器模式 2. 分发者模式(Dispatcher) 3. 通知者模式(notifier)

    • 基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。

    • reactor模型如下:
      在这里插入图片描述

    二:Reactor 模式

    I/O 复用结合线程池,就是 Reactor 模式基本设计思想,如图:
    在这里插入图片描述
    说明:

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

    三:单 Reactor 单线程

    在这里插入图片描述

    Reactor 模式中 核心组成
    • Reactor:Reactor 在一个单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对 IO 事件做出反应。 它就像公司的电话接线员,它接听来自客户的电话并将线路转移到适当的联系人;

    • Handlers:处理程序执行 I/O 事件要完成的实际事件,类似于客户想要与之交谈的公司中的实际官员。Reactor 通过调度适当的处理程序来响应 I/O 事件,处理程序执行非阻塞操作。

    方案说明:
    • 1:Select 是前面 I/O 复用模型介绍的标准网络编程 API,可以实现应用程序通过一个阻塞对象监听多路连接请求
    • 2:Reactor 对象通过 Select 监控客户端请求事件,收到事件后通过 Dispatch 进行分发
    • 3:如果是建立连接请求事件,则由 Acceptor 通过 Accept 处理连接请求,然后创建一个 Handler 对象处理连接完成后的后续业务处理
    • 4:如果不是建立连接事件,则 Reactor 会分发调用连接对应的 Handler 来响应
    • 5:Handler 会完成 Read→业务处理→Send 的完整业务流程
    方案优缺点分析:
    • 优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成

    • 缺点:性能问题,只有一个线程,无法完全发挥多核 CPU 的性能。Handler 在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈

    • 缺点:可靠性问题,线程意外终止,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障

    • 使用场景:客户端的数量有限,业务处理非常快速,比如 Redis在业务处理的时间复杂度 O(1) 的情况

    四:单 Reactor 多线程

    工作原理示意图

    在这里插入图片描述
    方案说明:

    • Reactor 对象通过select 监控客户端请求 事件, 收到事件后,通过dispatch进行分发
    • 如果建立连接请求, 则右Acceptor 通过 accept 处理连接请求, 然后创建一个Handler对象处理完成连接后的各种事件
    • 如果不是连接请求,则由reactor分发调用连接对应的handler 来处理
    • handler 只负责响应事件,不做具体的业务处理, 通过read 读取数据后,会分发给后面的worker线程池的某个线程处理业务
    • worker 线程池会分配独立线程完成真正的业务,并将结果返回给handler
    • handler收到响应后,通过send 将结果返回给client
    方案优缺点分析:
    • 优点:可以充分的利用多核cpu 的处理能力
    • 缺点:多线程数据共享和访问比较复杂, reactor 处理所有的事件的监听和响应,在单线程运行, 在高并发场景容易出现性能瓶颈.
    展开全文
  • Netty-Netty线程模型

    2021-05-28 15:45:27
    Netty线程模型概述 线程模型基本介绍 不同的线程模型、对程序的性能有很大影响,为了搞清Netty的线程模式,需要了解各个线程模式 目前存在的线程模型 传统阻塞IO服务模型 Reactor模型 根据Reactor的数量和处理...

    Netty

    Netty线程模型概述

    • 线程模型基本介绍
      • 不同的线程模型、对程序的性能有很大影响,为了搞清Netty的线程模式,需要了解各个线程模式
      • 目前存在的线程模型
        • 传统阻塞IO服务模型
        • Reactor模型
      • 根据Reactor的数量和处理资源线程的数量不同,有3中典型的实现
        • 单Reactor单线程
        • 单Reactor多线程
        • 主从Reactor多线程
      • Netty线程模型(Netty主要基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor)
    • 传统阻塞I/O服务模型
      • 工作原理图

        • 黄色框表示对象,蓝色框表示线程,黑色表示API
        • 在这里插入图片描述
      • 模型特点

        • 采用阻塞IO模式获取输入的数据
        • 每个连接都需要独立的线程完成数据的输入,业务处理和数据返回
      • 问题分析

        • 当并发数很大,就会创建大量的线程,占用很大的系统资源
        • 连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在read操作,造成线程资源浪费
    • Reactor模式基本原理
      • Reactor的翻译:1.反应器模式,2.分发者模式,3.通知者模式
      • 针对传统阻塞I/O服务模型的两个缺点,解决方案
        • 基于I/O复用模型:多连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理
        • 基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。
    • Reactor模式
      • I/O复用结合线程池,就是Reactor模式基本设计思想

        • 在这里插入图片描述
      • Reactor模式,通过一个或多个输入同时传递给服务处理器的模式(基于事件驱动)

      • 服务器端程序处理传入的多个请求,并将它们同步分发到响应的处理线程,所以Reactor模式也叫分发模式

      • Reactor模式使用IO复用监听事件,收到事件后,分发给某个线程(进程),这点就是网络处理器高并发的处理关键

    • Reactor模式中核心组成
      • Reactor:Reactor在一个单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对IO事件做出反应。
      • Handlers:Handler处理程序执行I/O事件要完成的实际事件(实际逻辑),Reactor通过调用适当的处理程序来响应I/O事件,处理程序执行非阻塞操作。
    • 单Reactor单线程
      • 工作原理图

        • 在这里插入图片描述
      • 说明

        • Select是前面I/O复用模型介绍的标准网络编API,可以实现应用程序通过一个阻塞对象监听多路连接请求
        • Reactor对象通过Select监控客户端请求事件,收到事件后通过Dispatch进行分发
        • 如果是建立连接请求事件,则由Acceptor通过Accept处理连接请求,然后创建一个Handler对象处理连接完成后的后续业务处理
        • 如果不是建立连接事件,则Reactor会分发调用连接对应的Handler来响应
        • Handler会完成Read-》业务处理-》Send的完成业务流程
        • 结合实例:服务器调用一个线程通过多路复用器复用搞定所有的IO操作(包括连接、读、写等),编码简单,清晰明了,但是如果客户端连接数量较多,将无法支撑,前面的NIO案例就属于这种模型
      • 单Reactor单线程方案优缺点分析

        • 优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成
        • 缺点:性能问题,只有一个线程,无法完全发挥多核CPU的性能。Handler在处理某个连接上的业务时,整个进程无法处理其他连接事件(这里是同步的体现),很容易导致性能瓶颈
        • 缺点:可靠性问题,线程意外终止,或者进入死循环,会导致整个通讯模块不可用,不能接受和处理外部消息,造成节点故障
        • 使用场景:适合用于客户端的数量有限,业务处理非常快,比如Redis在业务处理的时间复杂度O(1)的情况
    • 单Reactor多线程
      • 工作原理示意图

        • 在这里插入图片描述
      • 方案说明

        • Reactor对象通过select监控客户端请求事件,收到事件后,通过dispatch进行分发
        • 如果事件是建立连接请求事件,则Acceptor通过accept处理连接请求,然后创建一个Handler对象处理完成连接后的各种事件
        • 如果事件不是连接请求,则由Reactor分发调用对应的handler来处理
        • handler只负责响应事件,不做具体的业务处理,通过read读取数据后,会分发给后面的worker线程池的某个worker线程处理业务
        • worker线程池会分配独立线程完成真正的业务,并将结果返回给handler
        • handler接收到结果后,通过send将响应返回给client客户端
      • 单Reactor多线程模式的优缺点分析

        • 优点:可以充分的利用多核cpu的处理能力
        • 缺点:多线程会数据功能和访问比较复杂,reactor处理所有的事件的监听和响应,reactor是在单线程运行,在高并发场景容易出现性能瓶颈,整个系统的可靠性,还是在这个单线程的reactor上,如果这个reactor出现了异常,整个api还是会无法使用,不能接收和响应请求,整个节点故障
    • 主从Reactor多线程
      • 工作原理示意图

        • 针对单Reactor多线程模型中,Reactor在单线程中运行,高并发场景下容易单Reactor成为性能瓶颈,可以让Reactor在多线程中运行
        • 在这里插入图片描述
      • 方案说明

        • Reactor主线程MainReactor对象通过selector监听连接事件,收到事件后,通过Acceptor处理连接事件
        • 当Acceptor处理连接事件后,MainReactor将连接分配给SubReactor
        • subReactor将连接加入到连接队列进行监听,并创建handler进行各种事件处理
        • 当有新事件发生时(此时不可能是连接事件),subreactor就会调用对应的handler处理
        • handler通过read读取数据,分发给后面的worker线程处理
        • worker线程池分配独立的worker线程进行业务处理,并返回结果
        • handler收到响应的结果后,再通过send将结果返回给client
        • Reactor主线程可以对应多个Reactor子线程,即MainReactor可以关联多个SubReactor
      • 主从Reactor多线程方案优缺点说面

        • 优点:父线程与子线程的数据交互简单职责明确,父线程只需要接收新连接,子线程完成后续的业务处理
        • 优点:父线程与子线程的数据交互简单,Reactor主线程只需要把新连接传给子线程,子线程无需返回数据
        • 缺点:编程复杂度高
        • 结合实例:这种模型在许多项目中广泛应用,包括nginx主从Reactor多线程模型,Memcached主从线程,Netty主从多线程模型的支持
    • Reactor模式小结
      • 3种模式用生活案例来理解
        • 单Reactor单线程,前台接待员和服务员是同一个人,全程为顾客服务
        • 单Reactor多线程,1个前台接待员,多个服务员,接待员只负责接待
        • 主从Reactor多线程,多个前台接待员,多个服务员
      • Reactor模式具有的优点
        • 响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的
        • 减少资源开销,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销
        • 扩展性好,可以方便的通过增加Reactor实例个数来充分利用CPU资源
        • 复用性好,Reactor模型本身与具体事件处理逻辑无关,具有很高的复用性

    Netty模型-通俗版

    • 示意图1-简版
      • 模型

        • 在这里插入图片描述
      • 说明

        • BossGroup线程维护Selector,只关注Accept事件
        • 当接收到Accept事件时,获取对应的SocketChannel,封装成NIOSocketChannel并注册到Worker线程(事件循环),并进行维护
        • 当Worker线程监听到selector中的通道发生了自己感兴趣的事件(非accept事件)后,就进行处理(就由handler),注意handler已经加入到通道
    • 示意图2-进阶版
      • 在这里插入图片描述

    Netty模型-工作架构

    • 工作原理示意图
      • 在这里插入图片描述

      • 说明

        • Netty抽象出两组线程池BossGroup和WorkerGroup,其中BossGroup专门负责接收客户端的连接,WorkerGroup专门负责网络的读写
        • BossGroup和WorkerGroup类型都是NIOEventLoopGroup
        • NIOEventLoopGroup相当于一个事件循环组,这个组合中含有多个时间循环,每一个事件循环是一个NIOEventLoop
        • NIOEventLoop表示一个不断循环的处理任务的线程,每个NIOEventLoop都有一个selector,用于监听绑定在其上的socket的网络通讯
        • NIOEventLoop可以有多个线程,即可以含有多个NIOEventLoop
        • 每个Boss 的NIOEventLoop的步骤有3步
          • 轮训accept事件
          • 处理accept事件,与client建立连接,生成NIOEventSocketChannel,并将NIOEventSocketChannel注册到某个worker的NIOEventLoop的Selector上
          • 处理任务队列的任务,即runAllTasks
        • 每个Worker NIOEventLoop循环执行的步骤
          • 轮训read,write事件
          • 处理I/O事件,即read,write事件,在对应的NIOSocketChannel处理
          • 处理任务队列的任务,即runAllTasks
        • 每个Worker NIOEventLoop处理业务时,会使用pipline(管道),pipline中包含了channel,即通过pipline可以获取到对应通道,管道中维护了很多的处理器
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,360
精华内容 944
关键字:

netty线程模型