概述
Reactor是一种并发处理客户端请求与响应的事件驱动模型
服务端在接收客户端请求后采用多路复用策略
通过一个非阻塞线程来异步接收所有客户端请求
并将这些请求转发到相关的工作线程组进行处理
其核心是事件驱动
角色
Reactor线程
负责监听和分配事件, 将IO事件分派给对应的Handler, 新的事件包括连接建立就绪、读就绪、写就绪等
Handler处理器
将自身与事件绑定, 执行非阻塞IO任务, 完成channel读写, 一级业务逻辑
Acceptor
处理客户端新连接,并派发请求到处理器
单线程模型
指所有客户端IO请求都在同一个线程(Thread)上完成
Client
NIO客户端,向服务端发起TCP连接,并发送数据
Acceptor
NIO服务端,通过Acceptor接受客户端的TCP连接
Dispather
接收客户端的数据并将数据以ByteBuffer的形式发送到对应的解码器
DecoderHandler
解码器,读取客户端的数据并将数据进行解码和消息应答
EncoderHandler
编码器,将客户端发送的数据(消息的请求和应答)进行统一的编码处理,并写入通道
异步非阻塞IO,将所有IO操作都集中在一个线程中处理,处理流程如下
Acceptor接受客户端TCP连接请求消息
在链路建立成功通过Dispatcher将接收到的消息写入ByteBuffer,并派发对应的DecoderHandler进行消息解码和处理
在消息处理完成后调用对应的EncoderHandler将该请求对应的响应消息进行编码和下发
多线程模型
将Acceptor的操作封装在一组线程池中,通过线程池进行监听服务端端口,接收客户端TCP连接请求,处理网络IO读写等操作操作
线程池一般使用标准的JDK线程池,该线程池中包含一个任务队列和一系列NIO线程
这些NIO线程负责具体的消息读取,编码,解码和发送
主从多线程(MainReactor主,SubReactor从)
Reactor主线程MainReactor通过select监听客户端连接时间, 接收到事件后, 通过Acceptor处理客户端链接事件
当Acceptor处理完成链接事件后, MainReactor将连接分配到SubReactor<br>
SubReactor将连接加入到自己的连接队列进行监听, 并创建Handler各种事件进行处理<br>
当连接上有新事件发生, Subreactor就会调用对应的Handler处理<br>
Handler通过read从通道上获取数据, 将请求分发到Worker线程池处理业务
Worker线程池会分配独立线程完成业务处理, 并将处理请求返回给Handler, Handler通过send向客户端响应数据
一个MainReactor可以对应多个SubReactor, 即一个MainReactor线程对应多个SubReactor线程