NIO之Reactor模式

NIO之Reactor模式

Reactor模式是为了构建一个高性能的服务器端而采用的模式,它采用事件驱动的方式,能够有效应对高并发的场景。NIO也就是非阻塞IO,JDK网络NIO中的Selector的理念也是来自于Reactor模式,了解了Reactor模式,能够让我们更快地对JDK、netty或者其他框架的NIO的实现快速上手

Reactor模式的解释

Reactor模式源自Schmidt的一篇论文,目前网上搜到的很多博客都是对该论文的解读,个人觉得写得最好的博客是下面这篇:

https://www.toutiao.com/a6587127808290456077/

如果你认真对着文章的解释图和文字来看,大致理解Reactor模式并不困难。

一开始我对文中的Handle以及get_handle()方法不是很理解,从文章的描述中知道,注册之后,Initiation Dispatcher会调用get_handle(),通知的时候也是通知Handle,以及Event Handler是Handle的拥有者。如果简单对比到JDK的NIO编程,我们发现似乎没有这个get_handle()方法,其他的像select,register以及handl_event(type)方法都能很好的对应上NIO编程。下面是我的个人理解:

按照文章的意思,Handler定义了系统的资源,比如网络连接,打开的文件,以及同步对象等。在网络编程中,它代表着一个Socket终端。因此我们可以这样理解,在NIO中,Handle指的是channel,channel注册到Seletor上,我们主程序可以看成是Initiation Dispatcher,它会调用Synchronous Event Demultiplexer也就是JDK的Selector的select方法。

select调用后会返回SelectionKey,显然它只会返回注册的channel的事件。同时作为Handler类,必然会维护一个channel的变量,因为读写或者accept都要对channel进行操作。这两个因素结合可以看到流程中为什么有get_handle()这个方法,因为只有知道你需要的channel的事件后才能select并返回该channel的事件,只不过在JDK的NIO编程中,我们本身就是使用channel注册到Selector,注册后不再需要调用get_handle()方法获取到这个channel

Netty的Reactor模式

netty所采用的模式也是Reactor模式,如果你看过使用netty编写的服务端和客户端程序,大概知道netty里面有这样几个元素:

ServerBootstrap

EventLoopGroup

ChannelInboundHandlerAdapter

ServerBootstrap可以当成是Initiation Dispatcher,ChannelInboundHandlerAdapter的实现类是Handler,EventLoopGroup是线程池,对于服务端来说,一般需要两个线程池,一个用来监听客户端的连接,一个用来处理读写消息。至于为什么采用线程池,显然对于高并发场景,线程池是必须的,虽然我们常说NIO只需要一个线程就能管理所有的连接,相关的演变推荐看下面的博客:

https://www.cnblogs.com/doit8791/p/7461479.html

Reactor的代码实现可以看:

https://blog.csdn.net/fdsfdf3434/article/details/78657259

你可能感兴趣的:(java学习,JavaWeb,NIO,Reactor)