远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

  • 开源框架

  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

    • RPC架构设计及IO模型
    • NIO编程及其三大核心原理
    • NIO三大核心之缓冲区(Buffer)
    • NIO三大核心之通道(Channel)
    • NIO三大核心之选择器(Selector)
    • Netty核心原理
    • 线程模型以及传统IO阻塞模型
    • Reactor模型
    • Netty线程模型
      • Netty核心API介绍
      • Netty入门与异步模型
      • Netty高级进阶之Netty编解码器
      • Netty高级进阶之基于Netty的群聊天室案例
      • Netty高级进阶之基于Netty的HTTP服务器开发
      • Netty高级进阶之基于Netty的Websocket开发网页聊天室
      • Netty高级进阶之Netty中的粘包和拆包的解决方案
      • Nety源码剖析
      • 自定义RPC框架之分布式架构网络通信理论
      • 自定义RPC框架之基于Netty实现RPC框架
      • 分布式架构理论
      • 分布式理论之数据一致性
      • 分布式理论之CAP定理
      • 分布式理论之BASE定理
      • 分布式一致性协议之两阶段提交协议(2PC)
      • 分布式一致性协议之三阶段提交协议(3PC)
      • 分布式一致性协议之NWR协议
      • 分布式一致性协议之Gossip协议
      • 分布式一致性协议之Paxos协议
      • 分布式一致性协议之Raft协议
      • 分布式一致性协议之Lease机制
      • 分布式系统设计策略之心跳检测
      • 分布式系统设计策略之高可用
      • 分布式系统设计策略之容错性
      • 分布式系统设计策略之负载均衡
      • 分布式架构服务调用
      • 分布式服务治理之服务协调
      • 分布式服务治理之服务削峰
      • 分布式服务治理之服务降级
      • 分布式服务治理之服务限流
      • 分布式服务治理之服务熔断
      • 分布式服务治理之服务链路追踪
      • 架构设计基本原则之开闭原则(OCP)
      • 架构设计基本原则之单一职责原则(SRP)
      • 架构设计基本原则之接口隔离原则(ISP)
      • 架构设计基本原则之里式替换原则(LSP)
      • 架构设计基本原则之依赖倒置原则(DIP)
      • 架构设计基本原则知识扩展
      • 分布式架构知识拓展与总结
    • 分布式框架

    • 后端开发
    • 分布式
    terwer
    2022-05-04
    目录

    Netty线程模型

    # Netty线程模型

    Netty的设计主要基于主从Reactor的多线程模式,并做了一定的改进。

    1. 简单版Netty模型

      image-20220419225802316

      • BossGroup线程维护Selector,ServerSocketChannel注册到Selector上,只关注连接请求处理事件(主Reactor)
      • 当接收到来自客户端的连接请求事件时,通过ServerSocketChannel的accept方法获得对应的SocketChannel,并封装成NIOSocketChannel注册到WorkerGroup中的Selector,每个Selector运行在一个线程中(从Selector)
      • 当WorkerGroup中的Selector监听到对应的IO事件后,就调用对应的handler进行处理
    2. 进阶版Netty模型

      image-20220419231353965

      • 有两组线程池:BossGroup和WorkerGroup,BossGroup中的线程专门负责和客户端建立连接,WorkerGroup中的线程专门负责连接上的读写
      • BossGroup和WorkerGroup含有多个不断循环的执行事件处理的线程,每个线程包含一个Selector,用于监听注册在它上面的Channel
      • 每个BossGroup中的线程循环执行以下三个步骤
        • 轮询注册在其上的ServerSocketChannel的accept事件,OP_ACCEPT事件
        • 处理accept事件,与客户端建立连接,生成一个NIOSocketChannel,并将其注册到WorkerGroup中某个线程的Selector上
        • 以此循环处理任务队列中的下一个事件
      • 每个WorkerGroup中的线程循环执行以下三个步骤:
        • 轮询注册在其上的NIOSocketChannel的read/write事件,OP_READ/OP_WRITE事件
        • 在对应的NIOSocketChannel上处理read/write事件
        • 以此循环处理任务队列中的下一个事件
    3. 详细版Netty模型

      image-20220419233502608

      • Netty抽象出两组线程池:BossGroup和WorkerGroup,也可以叫BossNioEventLoopGroup和WorkerNioEventLoopGroup。

        每个线程池都有NioEventLoop线程。

        BossGroup中的线程专门负责和客户端建立连接,WorkerGroup中的线程专门负责处理连接上的读写。

        BossGroup和WorkerGroup的类型都是NioEventLoopGroup。

      • NioEventLoopGroup相当于一个事件循环组,这个组中含有多个事件循环,每个事件循环就是一个NioEventLoop。

      • NioEventLoop表示一个不断循环的执行事件处理的线程,每个NioEventLoop都包含一个Selector,用于监听注册在其上的socket连接(Channel)。

      • NioEventLoopGroup可以包含多个线程,即含有多个NioEventLoop。

      • 每个BossNioEventLoop循环执行以下三个步骤

        • select:轮询注册在其上的ServerSocketChannel的accept事件,OP_ACCEPT事件
        • processSelectedKeys:处理accept事件,与客户端建立连接,生成一个NIOSocketChannel,并将其注册到WorkerNioEventLoop的Selector上
        • runAllTasks:以此循环处理任务队列中的其他任务
      • 每个WorkerNioEventLoop循环执行以下三个步骤

        • select:轮询注册在其上的NIOSocketChannel的read/write事件,OP_READ/OP_WRITE事件
        • processSelectedKeys:在对应的NIOSocketChannel上处理read/write事件
        • runAllTasks:以此循环处理任务队列中的其他任务
      • 在以上两个processSelectedKeys步骤中,会使用Pipline(管道),Pipline中引用了Channel。

        通过Pipline可以获取对应的Channel,Pipline中维护了很多处理器(拦截处理器、过滤处理器、自定义处理器等)。

    编辑 (opens new window)
    #reactor#netty
    上次更新: 2023/02/22, 13:47:25
    Reactor模型
    Netty核心API介绍

    ← Reactor模型 Netty核心API介绍→

    最近更新
    01
    解决css部分border被圆角切掉之后圆角的边框消失问题
    03-18
    02
    使用TypeScript开发一个自定义的Node-js前端开发脚手架
    03-08
    03
    Github-Actions使用release-please实现自动发版
    03-06
    更多文章>
    Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式