Reactor模式 学习笔记

Posted Shi Peng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Reactor模式 学习笔记相关的知识,希望对你有一定的参考价值。

一、Reactor模式简介

1.1、简介

Reactor模式称为“反应器模式”或“分发者模式”。

Reactor模式的工作原理:由一个线程来接收所有客户端请求,然后派发请求到相关的工作线程中。

1.2、为什么使用reactor模式

若一个请求,服务端用一个线程处理,当并发高时会创建大量线程,维护线程需要耗费大量资源,线程间切换也耗费资源,且系统能创建的线程数是有限的。

二、Reactor模式的演进过程

Reactor模式有三个角色:
1)Reactor:负责响应请求,将请求分发到绑定了对应事件的handler上,如果是连接事件,则分发到Acceptor。

2)Handler:事件处理器。负责执行对应事件的业务逻辑。

3)Acceptor:绑定了connect事件,当客户端发起connect请求时,Reactor会将accept事件分发给Acceptor处理。

2.1、单Reactor单线程

在这里插入图片描述

工作流程

只有一个select循环接收请求,客户端注册进来,有Reactor接收注册事件,然后由Reactor分发 (dispatch) 出去,由下面的handler处理。

比喻

一个餐厅里只有一个服务员,负责接待客人,客人点菜后,服务员不负责做菜,而是把请求分给厨师做。

单Reactor单线程的特点

缺点:只要其中一个handler方法阻塞了,就会导致所有客户端的handler阻塞(因为是单线程handler),也会导致注册事件无法处理,无法接收新的请求。-- 因为reactor的接收请求和handler的处理是串行的,所以handler阻塞,会导致reactor阻塞。

而且单线程reactor无法充分利用多核CPU,用的场景较少。

2.2、单Ractor多线程

在这里插入图片描述

工作流程

在多线程Reactor中,注册接收事件都是由Reactor来做,其他的计算、编解码等请求,会放到一个线程池中,由线程池中的多线程来做。

所以,在单Reactor多线程模式中,监听注册事件由reactor单线程来做,业务处理由线程池中的多线程来做。

比喻

一个餐厅里有一个前台,负责接待所有客人,把所有客人的点菜需求都放到一个地方(线程池)就完事。而有多个厨师(多个handler)来领取点菜需求来做菜。

单Reactor多线程特点

相比单线程Reactor模型,多线程Reactor模型在handler读写处理时,交给线程池处理。这样reactor的分发和handler的处理通过线程池异步解耦。

缺点:reactor只在主线程中运行,承担所有事件的监听和响应,如果短时间的高并发场景下,依旧单reactor会成为性能瓶颈。

2.3、多reactor多线程

在这里插入图片描述

工作流程

1、mainReactor负责监听客户端请求,专门处理新连接的建立,将建立好的连接注册到subReactor。

2、subReactor将分配的连接,加入到线程池队列中进行监听,当有新的事件发生时,会调用连接相对应的handler进行处理。

比喻

餐厅里有多个前台,前台只负责接待客人,客人下单后,放到线程池,然后多个厨师去监听客户下单请求,然后去做菜。

多Reactor的特点

mainReactor用来处理客户端建立连接的请求,subReactor把建立好的连接放到线程池,hander监听线程池中的事件。(每个subReactor也是一个线程来处理)

备注:netty就用了多Reactor多线程模式。

三、多Reactor多线程模式在netty中的应用

netty算是NIO框架中的极品。

下图为netty的架构模型:
在这里插入图片描述
1、BossGroup相当于mainReactor,负责建立连接,并把连接注册到WorkGroup中,WorkGroup相当于subReactor, 负责处理连接对应的读写事件。

2、BossGroup和WorkGroup是两个线程池,里面都有多个NioEventGroup(相当于多个前台,每个NioEventGroup都是一个线程),默认BossGroup和WorkGroup里的线程数是CPU核数的两倍。

3、每一个NioEventGroup(相当于前台)都是一个无限循环,负责监听对应的事件。

4、Pipeline(管道)里包含了多个ChannelHandler(负责业务处理,可比喻成做菜的厨师),按顺序执行事件的业务处理。

问题:消费每个workgroup(即subReactor)的pipeline按说也是线程池的,把监听到的事件放到线程池里,然后由pipeline来领取事件,做相应的业务处理。

以上是关于Reactor模式 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

muduo网络库学习笔记:Reactor模式的关键结构

Netty 4.x学习笔记——线程模型

libevent学习笔记(参考libevent深度剖析)

RxJava 学习笔记

Netty学习2(学习笔记)

两种高性能 I/O 设计模式 Reactor 和 Proactor