网络服务器的基本功能就是建立连接,读取请求,解析请求,调用处理过程,编码结果,发送结果。下面部分截图来源于网络,Netty是典型的Reactor模型结构,下面说明一下Reactor模型的经典编程结构
单Reactor单线程模型
Reactor线程是多面手,负责多路分离套接字,Accept新连接,并分派请求到处理器链中。该模型适合处理器链中业务处理组件能快速完成的场景。不过这种单线程模型不能充分利用多核资源,所以实际是使用的不多。
单线程,即只有一个selector来接受建立连接请求,读取数据,处理请求,返回数据。
单Reactor多线程模型
相比上一种模型,该模型在处理链路部分采用了多线程(线程池),也是后端程序常用的模型
image.png
采用了多线程,虽然仍旧是单个selector线程,但是请求的处理大头交给了线程池异步执行。
多Reactor单线程模型
事实上,大部分网络程序为了更高的性能,都采用了多个Selector线程,即Reactor线程组的模型,Netty也不例外,采用了多个Selector。
image这张图近似于Netty的Reactor模型,唯一不同的是Netty并没有ThreadPool来异步的处理请求,而是串行的处理请求
说完Reactor模型的三种形式,那Netty是哪种呢?其实,还有一种Reactor模型变种没有说,那就是去掉线程池的第三种形式的变种,这也是Netty NIO的默认模式。在是线上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor。在处理新来的请求时 ,NioWorker读完已经收到的数据到ChannelBuffer中,之后触犯ChannelPipeLine中的ChannelHandler流。
Netty是事件驱动的,可以通过ChannelHandler链来控制执行流向。因为ChannelHandler链的执行过程在subReactor中是同步的,所以如果业务处理Handler耗时长,将会影响可支持的并发数。这种模型适合于像Memcache这样的场景, 但是对需要操作数据或者其他模块的阻塞交互的系统就不是很合适了。
网友评论