通俗易懂Reactor模型

什么是Reactor模型?
Reactor模型是基于事件驱动的分发处理模型,特别适合处理海量的I/O事件。

Reactor模型中定义的三种角色:
Reactor:负责监听和分配事件,将I/O事件分派给对应的Handler。新的事件包含连接建立就绪、读就绪、写就绪等。
Acceptor:处理客户端新连接,并分派请求到处理器链中。
Handler:将自身与事件绑定,执行非阻塞读/写任务,完成channel的读入,完成处理业务逻辑后,负责将结果写出channel。可用资源池来管理。

1.单Reactor单线程模型
在这里插入图片描述
消息处理流程:(select的实现)

1.Reactor对象通过select监控连接事件,收到事件后通过dispatch进行转发。
2.如果是连接建立的事件,则由acceptor接受连接,并创建handler处理后续事件。
3.如果不是建立连接事件,则Reactor会分发调用Handler来响应。
4.handler会完成read->业务处理->send的完整业务流程。

单Reactor单线程模型只是在代码上进行了组件的区分,但是整体操作还是单线程,不能充分利用硬件资源。handler业务处理部分没有异步。

对于一些小容量应用场景,可以使用单Reactor单线程模型。但是对于高负载、大并发的应用场景却不合适,主要原因如下:

1.即便Reactor线程的CPU负荷达到100%,也无法满足海量消息的编码、解码、读取和发送。
2.当Reactor线程负载过重之后,处理速度将变慢,这会导致大量客户端连接超时,超时之后往往会进行重发,这更加重Reactor线程的负载,最终会导致大量消息积压和处理超时,成为系统的性能瓶颈。
3.一旦Reactor线程意外中断或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障。
为了解决这些问题,演进出单Reactor多线程模型。

2.单Reactor多线程模型
在这里插入图片描述
消息处理流程:

1.Reactor对象通过Select监控客户端请求事件,收到事件后通过dispatch进行分发。
2.如果是建立连接请求事件,则由acceptor通过accept处理连接请求,然后创建一个Handler对象处理连接完成后续的各种事件。
3.如果不是建立连接事件,则Reactor会分发调用连接对应的Handler来响应。
Handler只负责响应事件,不做具体业务处理,通过Read读取数据后,会分发给后面的4.Worker线程池进行业务处理。
5.Worker线程池会分配独立的线程完成真正的业务处理,如何将响应结果发给Handler进行处理。
6.Handler收到响应结果后通过send将响应结果返回给Client。
相对于第一种模型来说,在处理业务逻辑,也就是获取到IO的读写事件之后,交由线程池来处理,handler收到响应后通过send将响应结果返回给客户端。这样可以降低Reactor的性能开销,从而更专注的做事件分发工作了,提升整个应用的吞吐。

但是这个模型存在的问题:

1.多线程数据共享和访问比较复杂。如果子线程完成业务处理后,把结果传递给主线程Reactor进行发送,就会涉及共享数据的互斥和保护机制。
2.Reactor承担所有事件的监听和响应,只在主线程中运行,可能会存在性能问题。例如并发百万客户端连接,或者服务端需要对客户端握手进行安全认证,但是认证本身非常损耗性能。
为了解决性能问题,产生了第三种主从Reactor多线程模型

3.主从Reactor多线程模型
在这里插入图片描述
消息处理流程: (简单地说:多个线程处理IO请求连接,线程池处理业务计算)

1.从主线程池中选择mainReactor线程作为acceptor线程,用于绑定监听端口,接收客户端连接
2.acceptor线程接收客户端连接请求之后创建新的SocketChannel
3.将SocketChannel注册到SubReactor线程池的线程上,并创建一个Handler用于处理各种连接事件
4.当有新的事件发生时,SubReactor会调用连接对应的Handler进行响应
5.Handler通过Read读取数据后,会分发给后面的Worker线程池进行业务处理
6.Worker线程池会分配独立的线程完成真正的业务处理,如何将响应结果发给Handler进行处理
7.Handler收到响应结果后通过Send将响应结果返回给Client
(解决了突发IO和密集计算的问题)

总结
Reactor模型具有如下的优点:
1.响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;
2.编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;
3.可扩展性,可以方便地通过增加Reactor实例个数来充分利用CPU资源;
4.可复用性,Reactor模型本身与具体事件处理逻辑无关,具有很高的复用性

转:https://cloud.tencent.com/developer/article/1488120

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值