文章目录

  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参数可配置化