Reactor模型概述

概念:

Reactor线程模型是一种并发编程模型,是一种思想,具有指导意义。

Reactor模型中定义了三种角色:

Reactor:负责监听和分配事件,将I/O事件分派给对应的Handler。新的事件包含连接建立就绪、读就绪 、写就绪等。

Acceptor:处理客户端新连接,并分派请求到处理器链中。

Handler:将自身与事件绑定,执行非阻塞读/写任务,完成channel的读入,完成处理业务逻辑后,负责 将结果写出channel

单Reactor单线程:

单个Reactor同时处理accept和read等事件,在读写事件占绝大部分比例的时候,大量读写事件占用了绝大部分Reactor资源,造成了线程的阻塞,accept事件的处理受到影响,影响连接效率,造成性能上的平静

 

 单Reactor多线程:

把比较耗时的数据的编解码运算操作放入线程池中来执行,此时我们加快了读写事件的处理效率,虽然提升了性能但还不是最好的方式

 

主从Reactor-多线程:

主从多线程,对于服务器来说,接收客户端的连接是比较重要的,因此将这部分操作单独用线程去操作。主Reactor负责accept事件,从Reactor负责读写等事件的处理。

 

主从Reactor工作流程:

Ø1)Reactor 主线程 MainReactor 对象通过 select 监听客户端连接事件,收到事件后,通过 Acceptor 处理客 户端连接事件。

Ø2)当 Acceptor 处理完客户端连接事件之后(与客户端建立好 Socket 连接),MainReactor 将连接分配给 SubReactor。(即:MainReactor 只负责监听客户端连接请求,和客户端建立连接之后将连接交由 SubReactor 监听后面的 IO 事件。)

Ø3)SubReactor 将连接加入到自己的连接队列进行监听,并创建 Handler 对各种事件进行处理。 Ø4)当连接上有新事件发生的时候,SubReactor 就会调用对应的 Handler 处理。

Ø5)Handler 通过 read 从连接上读取请求数据,将请求数据分发给 Worker 线程池进行业务处理。

Ø6)Worker 线程池会分配独立线程来完成真正的业务处理,并将处理结果返回给 Handler。Handler 通过 send 向客户端发送响应数据。

Ø7)一个 MainReactor 可以对应多个 SubReactor,即一个 MainReactor 线程可以对应多个 SubReactor 线程

主从Reactor的优势

Ø1)MainReactor 线程与 SubReactor 线程的数据交互简单职责明确,MainReactor 线程只需要接收新连接, SubReactor 线程完成后续的业务处理。

Ø2)MainReactor 线程与 SubReactor 线程的数据交互简单, MainReactor 线程只需要把新连接传给 SubReactor 线程,SubReactor 线程无需返回数据。

Ø3)多个 SubReactor 线程能够应对更高的并发请求。

备注:这种模式的缺点是编程复杂度较高。但是由于其优点明显,在许多项目中被广泛使用,包括 Nginx、 Memcached、Netty 等。 这种模式也被叫做服务器的 1+M+N 线程模式,即使用该模式开发的服务器包含一个(或多个,1 只是表示相对 较少)连接建立线程+M 个 IO 线程+N 个业务处理线程。这是业界成熟的服务器程序设计模式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值