Reactor模型概述
The reactor design_pattern is an event_handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.
from wiki
从wiki百科中可以得知,Reactor
是一种设计模式,并且基于事件驱动
特点:
Reactor
由service handler
和requests handlers
组成- 一个
service handler
能够处理多个输入 service handler
负责监听IO并且将事件分发给相应的requests handlers
处理
为了简述方便,在后续中以Reactor
代指service handler
,Handler
代指request handlers
为什么要使用reactor
传统模型的不足
传统模型采用一个客户对应一个连接,在面对大量客户连接时,创建线程数量多,造成资源浪费,且产生大量上下文切换,非常消耗cpu资源,此时反应器设计模式出场了。
单Reactor单线程模型
Reactor
模型基于IO
复用模型,可以实现一个线程阻塞
监听多个连接,且当连接到来时,由内核通知
该线程去处理。此时线程将受到的连接分发给对应的处理器处理。
Reactor | Handlers | |
---|---|---|
监听事件(accept) | take over(线程a ) | |
响应事件(read、send) | take over(线程a ) | |
业务处理事件 | take over(线程a ) |
优点:
相对于传统模型,提升客户连接的吞吐量,适用于主要为主存IO的业务场景
缺点:
无法应对大量耗时的外存IO请求
(read操作耗时
),会导致事件堆积,从而导致连接超时
单Reactor多线程模型
为了提高服务器性能,并且充分利用多核处理器,此时,在单Reactor单线程模型的基础上,将业务处理事件
抽离出单线程
中,并且插入线程池
中运行
Reactor | Handlers | |
---|---|---|
监听事件(accept) | take over(线程a ) | |
响应事件(read、send) | take over(线程a ) | |
业务处理事件 | take over(线程池 ) |
优点:
在单Reactor单线程模型下提高了性能与可靠性
缺点:
由于监听事件
和响应事件
处于同一线程
,当有大量客户请求接入时响应事件就无法及时得到处理,并且当有大量响应事件触发时,监听事件就无法处理
多Reactor多线程模型(主从Reactor模型)
在单Reactor多线程模型下将监听事件
与响应事件
分离,使用一个Reactor
处理监听事件
,多个Reactor
处理响应事件
Reactor | Handlers | |
---|---|---|
监听事件(accept) | take over(线程a ) | |
响应事件(read、send) | take over(线程b、线程c.... ) | |
业务处理事件 | take over(线程池 ) |