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模式 学习笔记的主要内容,如果未能解决你的问题,请参考以下文章