作为一个程序员,平时少不了要学习新的东西,最近学习Netty框架,Netty是由JBOSS提供的一个java开源框架,Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,Netty简化和流线化了网络应用的编程开发过程。
Netty就是基于Reactor线程模型开发的,我们今天来简单分析下:
Reactor模型中的三种角色及含义:
Reactor:将I/O事件分配给对应的handler。
Acceptor:处理客户端新连接,并分派请求到处理器链中。
Handlers:执行非阻塞读写任务。
Reactor常用的线程模型有三种,
1.Reactor单线程模型。
单线程模型简图
单线程模型就是指所有的I/O操作都是在一个线程中处理完成,NIO的线程需要接受客户端的Tcp连接,并且向客户端发送Tcp连接,读取通信两端的请求或应答,发送请求和应答。
单线程模型详细图解
大致了解了后,让我们看下这个详细流程,当客户端发起连接,Acceptor负责接收客户端的Tcp请求,链路建立成功后,通过Dispatcher将对应的ByteBuffer派发到指定的Hnadler上进行消息解码,用户Handler通过NIO线程将消息发送给客户端。单线程模型其实就是Acceptor的处理和Handler的处理都处在同一个线程中,当其中的一个Hnadler阻塞时,会导致其它的client和handler无法执行,甚至整个服务不能接受新的请求。
单线程模型缺点:不适用于高负载,高并发的场景。
因为一个NIO线程如果同时处理很多的链路,则机器在性能上无法满足海量的消息的编码,解码,读取和发送。如果NIO线程负载过重,处理速度变慢,会导致大量的客户端请求超时,甚至导致整个通信模块不可用。
2.Reactor多线程模型。
为了解决单线程模型的缺点,设计出了多线程模型。如下简图:
多线程模型简图
如图所示在多线程模型下,用一个专门的NIO线程Acceptor来监听服务端,客户端的Tcp请求,对于网络I/O的读写操作和消息的读取、编码、解码、发送等使用NIO线程池来完成。因为客户端请求数量大于NIO线程池中的线程,一个NIO线程可以同时处理多条链路请求,但是一个链路请求只对应一个NIO线程。Reactor多线程模型能够大多数的使用场景,但是当客户端的并发连接非常的多,或者是服务端需要对客户端进行安全认证等,单个Acceptor线程可能会存在性能不足的问题。
3.主从Reactor多线程模型。
Reactor的主从多线程模型
如图所示,从这个简图可以看出,服务端用于监听和接收客户端连接的不再是单个线程,而是分配了一个线程池。Acceptor线程池接收了客户端的请求连接并处理完成后(可能包含了权限认证等),后续的I/O操作再由NIO线程池来完成。这样就解决了多线程中客户端请求太多或者需要认证时一个Acceptor可能处理不过来的性能问题。