Netty底层io原理迭代史

1)传统阻塞IO模式:

  • 存在的问题:

  • 当并发数很大时,就会创建大量的线程,占用很大的系统资源。

  • 当连接创建后,如果当前线程没有进行任何读写操作,线程会阻塞,造成系统资源的浪费。

Netty底层io原理迭代史

2)Reactor模式:

通过一个或多个输入同时传递给服务器处理器的模式(基于事件驱动),采用IO多路复用监听事件(服务器高并发处理的关键),服务器程序处理多个请求后分发给对应的线程处理。

Netty底层io原理迭代史

  • 2.1 单Reactor单线程模式:
    • 优点:模型简单,所有操作都在一个线程中完成,没有多线程、进程通信、竞争的问题。
    • 缺点:无法完全发挥多核CPU的性能,很容易导致性能瓶颈。可靠性不高,线程意外终止时,会导致整个系统通信模块的不可用,造成节点故障。
    • 实用场景:客户端数量有限,业务处理速度快。
  • Netty底层io原理迭代史
  • 2.2 单Reactor多线程模式:
    • 优点:可以充分的利用多核CPU的处理能力,将业务处理分发,提高了业务处理效率和性能。
    • 缺点:多线程数据共享和访问比较复杂,Reactor处理所有的事件的监听和响应,在单线程运行,高并发场景下容易出现性能瓶颈。
  • Netty底层io原理迭代史
  • 2.3主从Reactor多线程模式:
    • 优点:父线程与子线程的职责明确,父线程只需要接收新连接,子线程完成后续的业务处理。Reactor主线程只需要把新连接传给Reactor子线程(Reactor子线程不止一个),子线程无需返回数据。
    • 缺点:编码复杂
    • 应用场景:许多项目中广泛应用,包括Nginx主从Reactor多进程模型,Memcached主从多线程,Netty主从多线程模型的支持。
  • Netty底层io原理迭代史

3)Netty线程模式(主要基于主从Reactor多线程模式做了一定的改进):

  • Netty抽象出两组线程池:
    • 1.BossGroup专门负责接收客户端的连接。
    • 2.WorkerGroup专门负责网络读写的业务处理。
    • 底层都是运用了多个事件循环NioEventLoop不断循环分发处理客户端的连接请求和读写业务。
    • Boss NioEventLoop循环步骤
      • 1.轮询accept事件
      • 2.处理accept事件,完成于客户端的连接,并将生成的SocketChannel注册到Worker NioEventLoop上的selector
      • 3.处理任务队列的任务,即runAllTasks
    • Worker NioEventLoop循环步骤
      • 1.轮询read、write事件
      • 2.在对应得SocketChannel处理I/O事件
      • 3.处理任务队列的任务,即runAllTasks

Netty底层io原理迭代史