Netty使用和常用组件辨析

92 阅读2分钟

Netty使用和常用组件辨析

Netty的线程模型

  • Netty通过Reactor模型基于多路复用器接收并处理用户请求,内部主要实现了两个线程池

    • boss线程池

      • 负责处理请求的接收工作,当收到请求时,会把对应的socket封装成一个NioSocketChannel,并交给work线程池处理
    • work线程池

      • 负责处理请求的读写操作,然后交给对应的Handler处理
  • Reactor模型有三种

    • 单线程模式

      • 一个线程负责多个事件处理,当连接数过多时会造成性能瓶颈,适用于连接数较少、复杂度较低的场景
    • 多线程模式(单线程、工作线程池)

      • 在单线程Reactor模式的基础上,将业务处理部分交给了线程池,提升并发能力,但是要注意线程安全
    • 主从多线程模式

      • 将整体拆分为主、从Reactor,主Reactor负责监听连接事件,将事件分发给从Reactor去处理,从Reactor负责与客户端读写操作,充分利用多核CPU,提升并发能力

TCP粘包/拆包

  • TCP是以流的方式来处理数据,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送

  • 粘包/拆包的原因

    • 用户写入的数据大小 大于 发送到缓冲区的大小,会发生拆包的现象(一个放不下)
    • 用户写入的数据大小 小于 发送到缓冲区的大小,会发生粘包(多个合并到一起)
  • 解决粘包/拆包的方法

    • 消息定长
    • 用特殊字符进行分割

Netty的重要组件

  • Channel

    • 主要负责网络操作,比如连接、IO读写等
  • EventLoop

    • 配合Channel处理I/O操作
  • ChannelFuture

    • 通过ChannelFuture注册监听事件,对于执行结果自动触发返回结果
  • ChannelHandler

    • 处理各种事件,比如连接、异常、数据处理等
  • ChannelPipeline

    • Channel创建时会分配专属的ChannelPipeline进行关联,相当于放到了容器内

Netty的零拷贝实现

  • 在网络通信上,接收和发送数据通过直接内存进行操作
  • 在缓存操作上,通过合并多个缓冲数据,避免重复拷贝
  • 在文件传输上,直接通过文件缓冲数据传输到管道,避免拷贝