Reactor模式

背景:

传统的服务端体系结构,每当有请求时,都会创建一个线程(进程)来处理请求,请求处理完之后就销毁线程,这样的成本是比较高的,频繁的创建和销毁线程,也会造成资源的浪费。所以可以考虑采用线程池的方式,免去创建和销毁线程的成本,提高服务端的效率。但是引入线程池后,还有另外一个问题,一般情况下,由于高并发场景,而且IO比较耗时,所以请求的数量是超过线程池中线程的数量的,一个线程会处理多个连接。如果处理一个连接的过程中,只能阻塞处理的话,那性能还是很差,所以要设计成非阻塞的。非阻塞也有不同的方式,比如采用轮询,但是轮询的方式并不优雅,因为轮询是消耗CPU的,而且如果有成千上万的连接的话,轮询的效率也比较低。最好是只有当连接上有数据的时候再去处理,这就是IO多路复用技术。IO多路复用技术再结合线程池,就是Reactor模式。
说明:根据不同的编程语言和程序运行平台,有的是用线程,有的是用进程,原理都是一样的。文章中就按照线程来说明。

Reactor的核心是Reactor和处理资源池。
Reactor模式可以分为三种:单Reactor单线程,单Reactor多线程,多Reactor多线程。

单Reactor单线程:

在这里插入图片描述
Reactor通过select监控连接事件,收到事件后,通过dispatch进行转发。
如果是连接建立的事件,就转发给Acceptor,Acceptor负责接收Client的连接请求,通过accept接收连接,并且会创建一个Handler来处理该连接后续的各种事件。
如果不是连接建立的事件,Reactor会把这个事件转发给对应的Handler进行处理,Handler处理完成后,会把结果消息发送给Client。

单Reactor单线程模式,Acceptor和Handler的处理都在同一个线程中,而且只有一个线程。优点就是简单,没有线程间的通信,适用于并发量较小的业务场景。但是缺点也比较明显,那就是不能支持高并发。只有一个线程,无法发挥多核CPU的性能,如果某个Handler在执行过程中发生了阻塞或者进入了死循环,那其它所有的Handler都无法执行,Acceptor也无法接收新的连接。
Redis采用的是单Reactor单进程的模式。

单Reactor多线程:

在这里插入图片描述
单Reactor多线程和单Reactor单线程的最大区别就是设计了一个NIO线程池来处理IO操作。
Reactor还是在主线程中,通过select监听事件,收到事件后通过dispatch进行分发。
Acceptor还是单线程处理连接建立的事件,但是Reactor接收到非连接建立的请求后,会把请求交给线程池来进行处理。

单Reactor多线程的模式,能够利用多核CPU的能力,提高系统的并发,可以满足大部分的场景。但是也存在一些问题,比如Reactor承担所有的事件监听和相应,瞬间的高并发也会成为性能瓶颈,而且Acceptor还是单线程的方式,如果服务建立连接的逻辑比较复杂,比如包含安全认证,权限校验等逻辑,那么单线程的Acceptor也可能会成为瓶颈,造成连接超时。

多Reactor多线程:

在这里插入图片描述
多Reactor多线程,也叫做主从Reactor多线程模型,和单Reactor多线程模式相比,多Reactor多线程分配了一个线程池用来接收连接建立请求。
多Reactor多线程模型分为Main Reactor和Sub Reactor。Main Reactor通过select监听连接建立事件,交给Acceptor处理,Acceptor处理完成后,会新建SocketChannel注册到Sub Reactor的某个线程上。Sub Reactor会负责SocketChannel的读写和编解码工作,并且创建对应的Handler来负责后续的IO操作。

多Reactor多线程模式,Main Reactor和Sub Reactor分工明确,Main Reactor负责接收新连接,Sub Reactor负责后续的业务处理。这样Main Reactor和Sub Reactor之间的交互就会很简单,并且解决了单Reactor多线程模式无法处理高并发的连接建立事件的弊端。

Nginx 用的是多Reactor多进程模式,Memcache 和 Netty是多Reactor多线程模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值