# Netty

  • 解决了NIO的Epoll Bug(Selector空轮询,CPU100%的BUG)
  • 设计优雅
    • 适用于各种传输类型的统一API阻塞与非阻塞Socket;
    • 灵活可扩展的事件模型,清晰的分离了关注点
    • 线程模型支持单线程、一个或多个线程池
  • 使用方便
    • 无额外依赖
    • 文档、指南、示例全
  • 高性能、高吞吐、低延迟、低资源消耗、最小化内存复制
  • 安全:SSL/TLS,StartTLS支持
  • 社区活跃

# Reactor模式

IO利用结合线程池,又叫Dispatcher模式

  • 一个或多个请求同时传递给“服务处理器(基于事件驱动)“
  • 程序处理传入的多个请求,并将它们同步分派到相应的处理线程
  • 采用IO复用监听事件,收到事件后,分发给某个线程(进程)

Client--------event------->eventDispatcher(ServiceHandler)--------dispatch----->EventHandler(处理线程)

核心组成:

  • Reactor:单独线程中运行,负责监听与分发事件,把事件分发给适当的处理程序处理IO事件
  • Handlers:处理程序执行IO事件要完成的实际任务

模式分类:

  • 单Reactor

    • 模型简单,没有多线程、进程通信、竟争的问题
    • 性能问题,无法发挥多核CPU的性能,Handler在处理某连接任务时,无法处理其它连接事件
    • 可靠性问题,线程意外终止或进入死循环,会导致事件通信模块不可用
  • 单Reactor 多线程

    • handler只负责响应事件,不再做业务处理,由Worker线程池来做业务处理
    • 利用多核优势
    • 数据共享与访问复杂,reactor主线程处理事件的监听与响应,是单线程,高并发场景产下有性能瓶颈
  • 主从Reactor 多线程

    • 主线程MainReactor通过Select监听连接事件,通过Acceptor处理连接事件
    • 连接事件处理后,MainReacotr将连接分配给SubReactor(可有多个),SubRactor将连接加入连接队列监听,并创建Handler进行事件处理
    • handler通过处理IO,分发给Worker线程(可有多个)处理业务

    优点:

    • 父子线程交互简单,职责明确
    • Reactor主线程只需要把连接传递给子线程,子线程无需要返回数据

    缺点:

    • 编程复杂度高

Netty的线程模型:

基于主从Reactor多线程模型做了优化,BossGroup线程维护Selector,只关注Accept;收到Accept事件,获取到对应的SocketChannel封装成NIOSocketChannel并注册到Worker线程(事件循环),并进行维护;WorkerGroup线程监听到Selector中通道发生自己感兴趣的事件后,由handler处理

  • 两组线程池( NioEventLoopGroupo类型)
    • BossGroup:负责接收客户端连接
    • WorkerGroup:负责网络读写
  • NioEventLoopGroup
    • 可以有多个线程,即可含有多个NioEventLoop,相当于事件循环组,这个组中含有多个事件循环,每个事件循环是NioEventLoop
    • NioEventGroup表示一个不断循环的执行处理任务的线程,每个上面都有一个selector,用于监听绑定在其上的socket网络通信
  • BossGroup中的NioEventLoop循环执行
    • 轮询accept事件
    • 处理accept事件,与client建立连接,生成NioSocketChannel,并将其注册WorkerGroup上的某个NioEventLoop上的selector
    • 处理任务队列的任务,即runAllTasks
  • WokerGroup中的NioEventLoop执行
    • 轮询read/write事件
    • 处理IO事件,即read/wirte事件,在对应的NioSocketChannel处理
    • 处理任务队列的任务,即runAllTasks

``

上次更新: : 5 months ago