什么是Reactor模型?Netty线程模型又是什么样的?

484 阅读3分钟

Reactor的诞生主要原因是互联网的飞速发展,传统的BIO模型的开发方式在日益增多的网络连接请求中,显现出了在大量连接请求处理上的力不从心。

根据之前IO模型的学习,我们大概已经能够感受到BIO模型相对于其他IO模型显现出来的劣势。而在Selector的学习,我们也深刻感受到了IO多路复用的魅力,而Netty是在Java Selector的基础之上做了一层封装,把注册、选择器刷新轮询等操作封装到了Netty底层。Netty充分运用了Reactor模型,将网络请求按照不同类型分发处理,简化了线程管理,显著提高了并发量。接下来,我们就了解一下Reactor模型。

Reactor介绍

Reactor模型时一种经典的事件驱动编程模型。Reactor 模型通过一个或多个输入进行事件注册,然后当事件发生时,会主动调用相关的回调函数

Reactor模型中有三种角色,分别是:

Acceptor:处理客户端新连接,并分派请求到处理器链中
Reactor:负责监听和分配事件,将I/O事件分派给对应的Handler。
Handler: 事件处理,如编码、解码等。

Reactor 线程模型

Reactor有三种线程模型分别是:单Reactor单线程模型、单Reactor多线程模型、主从Reactor多线程模型。而Netty正是采用最后一种。

单Reactor单线程模型

在此模型下,所有请求建立、读取和写入、编解码、业务处理都在一个线程中完成。看起来似乎很合理,但是这样的线程模型有一个致命的缺点,就是如果在业务中处理中出现了耗时操作,就会导致所有请求处理全部延时,造成阻塞,影响系统性能

单Reactor单线程模型

单Reactor多线程模型

为了防止耗时的业务处理导致阻塞,就需要把业务处理部分交给其他线程来运行。于是,通常会用一个线程池来异步处理业务,当处理完成后在回写给客户端,这就有了下图的单Reactor多线程模型。

单Reactor多线程模型

主从Reactor多线程模型

虽然单Reactor多线程模型已经能够处理大量的连接请求,但是由于单Reactor中所有的连接建立、读取、响应都在Reactor线程中处理,无疑是增大了Reactor的压力,在高并发场景下容易成为性能瓶颈,于是就出现了主从Reactor。在主从Reactor多线程模型中,主Reactor仅仅负责处理连接,建立连接后将Channel注册到子Reactor中,进行处理IO读写,然后交给线程池处理业务。

主从Reactor多线程模型

Netty线程模型

Netty采用了主从Reactor模型实现,其中主Reactor在Netty中对应Boss group 线程组,子Reactor对应Worker Group 线程组。主Reactor仅负责建立连接,工作简单,一般设置1个线程就足够。在主Reactor建立好连接后,将其注册到Worker Group线程组,触发相应的IO事件,最终由Pipeline中的多个Handler进行有序处理(对于图中的其他概念会在之后的文章中讲解)。

Netty线程模型