React设计模式
‘The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.’
React设计模式是一种用来处理单个或多个服务请求的事件处理模式,服务处理器会将请求同步分发给相关的处理器做具体请求处理。netty框架主要依据这种设计模式构建。Reactor三种模式netty框架中都有不同实现
在单线程模式中,eventloopgroup中只有一个线程,负责连接的建立以及所有数据的读写操作,在非主从模式中,多个线程共同分担数据处理工作,缓解单线程压力,在主从模式中,数据读写操作和连接建立以及释放等操作分为两个不同的线程组执行,分工更加明确,效率更高。
单线程模型
- 传统BIO同步阻塞方式
- 服务端为每个连接创建一个独立线程,负责连接建立以及数据读写操作
- 连接较多时会创建大量线程,性能急剧下降,存在资源浪费
- 适用于连接较少场景
React单线程
- 与BIO方式不同,所有连接上的IO读写事件以及连接建立等操作全部由一个线程处理
- 单线程不能充分利用多核cpu资源,存在资源浪费
- 适用连接较少且处理任务能快速完成的场景
React非主从多线程
- 在Reactor单线程基础之上,采用线程池方式多线程处理IO操作,通过线程工作分工,高并发场景下,相比单线程模型,一定程度上提升性能;
- 创建特定的线程acceptor负责接收连接请求;
- 线程池负责具体的IO操作,单个线程可处理多个连接上的IO操作,但每个连接请求只能绑定一个特定的工作线程;
- 多线程模型可充分利用CPU资源;
- 适合大量连接,高并发场景
React主从多线程
- 相比Reactor多线程模型,主从多线程模型根据请求类型不同对Reactor再次进行细分,分为mainReactor和subReactor;
- mainReactor主要负责新建连接请求;
- Acceptor收到连接建立请求后分发至后端subReactor;
- subReactor负责分发连接的socket至不同的工作线程进行绑定;
- Socket连接与线程池中的工作线程是一对一关系;
- 工作线程与Socket连接是一对多关系,每个工作线程可绑定多个socket连接,负责连接上的读写事件处理。