前言
线程模型是Netty框架的核心,模型设计的好坏决定了框架的性能、并发量和安全性等架构质量。
Netty的线程模型被精心的设计,既提升了框架的并发性能,又在很大程度避免锁,局部实现了无锁化设计。
因此这篇文章将介绍Netty的线程模型,看看它的线程模型是如何设计用于支持高并发高性能的。
三种Reactor线程模型
提到线程模型,比较经典的是Reactor线程模型,尽管不同的NIO框架对Reactor模型的实现有所差异,但是本质上还是遵循了Reactor的基础线程模型。
什么是Reactor线程模型?
Reactor线程模型是对于传统的I/O线程模型的一种优化。
传统的I/O线程模型采用阻塞I/O来获取输入流数据,并且每个连接都需要独立的线程完成数据的输入、业务处理、数据返回等一个完整的操作链路。这种模型在高并发场景下,有两个比较明显的缺点:
-
每个连接都需要创建一个对应线程,线程大量创建占用大量的服务器资源
-
线程没有数据可读情况下的阻塞会对性能造成很大的影响
Reactor线程模型为了解决这两个问题,提供了以下解决方案:
-
基于I/O多路复用:多个客户端连接共用一个阻塞对象,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,通过事件驱动通知应用程序,线程从阻塞状态返回,开始进行业务处理
-
基于线程池技术减少线程创建:基于线程池,不必再为每一个连接创建线程,将连接完成后的业务处理分配给线程池进行调度
Reactor线程模型图:
Reactor线程模型
Reactor在一个单独的线程中进行,负责监听和分发事件。
Reactor的两个核心组件:
-
EventDispatch:监听和分发事件,分发给适当的处理程序来对IO事件做出反应
-
handlers是处理程序执行IO事件要完成的实际事件,Reactor 通过调度适当地处理程序来响应I/O事件,处理程序执行非阻塞操作。
有
Reactor模式使用I/O复用监听事件,收到事件后,分发给某个线程去处理,这也是能