文章目录

  1. 1. 异步非阻塞通信
  2. 2. 高效的Reactor线程模型
  3. 3. 无锁化的串行设计
  4. 4. 高效的并发编程
  5. 5. 高性能的序列化框架
  6. 6. 零拷贝
  7. 7. 内存池
  8. 8. TCP参数可配置化


微信公众号

本文是《Netty 权威指南》的摘要和读后感,收获颇深,整理成文。

异步非阻塞通信

  • Netty的I/O线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端SocketChannel。由于读写操作都是非阻塞的,这就可以充分提升I/O线程的运行效率,避免由频繁的I/O阻塞导致的线程挂起。
  • Netty采用了异步通信模式,一个I/O线程可以并发处理N个客户端连接和读写操作。

高效的Reactor线程模型

  • Reactor单线程模型
    所有的I/O操作都在同一个NIO线程上完成。
  • Reactor多线程模型
    有一个专门的NIO线程,Acceptor线程用于监听服务端,接收客户端的TCP连接请求。读写有一个NIO线程池负责。1个NIO线程可以同时处理N条链路,但是一个链路只对应1个NIO线程。
  • 主从Reactor多线程模型
    与Reactor多线程模型不同的是,服务端用于接收客户端连接的不再是1个单独的NIO线程,而是一个独立的NIO线程池。Acceptor接收到客户端TCP连接请求处理完成后,将新创建的SocketChannel注册到I/O线程池。Acceptor线程池只用于客户端的登陆、握手和安全认证,一旦链路建立成功,就将链路注册到后端subReactor线程池的I/O线程上,由I/O线程负责后续的I/O操作。

Netty可以支持上述三中国Reactor线程模型。

无锁化的串行设计

Netty通过串行化设计,即消息的处理尽可能在同一个线程内完成,期间不进行线程切换,这样就可以避免了多线程竞争和同步锁。

高效的并发编程

Netty的高效并发编程主要体现在如下几点:

  • volatile的大量、正确使用;
  • CAS和原子类的广泛使用;
  • 线程安全容器的使用;
  • 通过读写锁提升并发性能。

高性能的序列化框架

Netty默认提供了对Google Protobuf的支持,通过扩展Netty的编解码接口,用户可以实现其它的高性能序列化框架,例如Thrift的压缩二进制编解码框架。

零拷贝

  • Netty接收和发送ByteBuffer采用DIRECT BUFFERS,使用堆外直接内存进行Socket读写,不需要进行字节缓冲区的二次拷贝。
  • 对外将多个ByteBuf封装成一个ByteBuf,对外提供统一封装后的ByteBuf接口。
  • Netty文件传输类DefaultFileRegion通过transferTo方法将文件发送到目标的Channel中。

内存池

为了尽量重用缓冲区,Netty提供了基于内存池的缓冲区重用机制。

TCP参数可配置化

Netty在启动辅助类中可以灵活的配置TCP参数,满足不同的用户场景。

文章目录

  1. 1. 异步非阻塞通信
  2. 2. 高效的Reactor线程模型
  3. 3. 无锁化的串行设计
  4. 4. 高效的并发编程
  5. 5. 高性能的序列化框架
  6. 6. 零拷贝
  7. 7. 内存池
  8. 8. TCP参数可配置化