保护私人版权,尊重他人版权。转载请注明出处并附带页面链接
概念
传统BIO方式的网络连接处理:客户端发起请求,服务器accept一个请求,经过读取,解码,计算,编码,发送等过程,完成一次请求的处理。这个过程中,accept如果阻塞了,会导致后面的请求也被阻塞。
为了解决BIO引起的IO阻塞问题,提出了NIO。NIO的主要工作方式是无论IO有没有准备就绪,都会直接返回结果,不阻塞,具体由操作系统底层实现的select、poll、epoll完成。基于NIO,我们可以实现高性能的网络处理,一种有效的模型就是Reactor。
Reactor应用于网络高性能框架中,Redis,Netty中都有它的身影。
Reactor模型中的相关组件
了解AWT,写过桌面端或者客户端(Java的GUI,Android等)的同学会很熟悉这张图,基于事件响应的模型。用户发生click动作,产生相应的事件,事件会传播给对应注册了监听事件的组件进行处理,运用了观察者模式。Reactor与这种模式是很类似的。
Reactor:负责响应IO事件,转发事件到相应的handler。类似AWT线程。
handler:类似图中的button调用addActionListener方法进行监听注册,将handler与事件绑定,等待事件就绪后进行处理。我们可以当他是一个Worker。
单Reactor单Handler下的Reactor模型
如图所示,其中的acceptor是Reactor中注册了accept的IO事件,用于处理建立连接的。相当于一个Reactor线程处理连接,一个Hanlder线程处理读,解码,计算,解码,发送。
单Reactor多Handler模型
如图所示,是一个多Handler的模型,用线程池管理Handler线程。同时,Hanlder也不再负责有关读写的操作,即不负责处理IO读写,只做解码,计算,编码的操作。read和send交给Reactor做。
多Reactor多Handler模型
如图所示,有一个主Reactor,接受请求后将读写的处理交由子Reactor操作,这样就提高了对CPU的利用率。