美文网首页
Reactor反应式模式(事件驱动模式)

Reactor反应式模式(事件驱动模式)

作者: 华木公子 | 来源:发表于2019-07-31 16:25 被阅读0次

一 reactor的前世今生

高性能IO绕不开Reactor模式,NIO是Java对Reactor模式的实践,而大多数IO相关组件如Netty、Redis则是NIO的实践。个人觉得AKKA框架也是reactor的实践,包括公司以前用的actor编程框架。

  1. 最开始的网络编程
while(true){ 
socket = accept(); 
handle(socket) 
} 

可以看到是完全阻塞处理的

  1. 做个线程优化,对于产生的socket用新的线程来处理
while(true){ 
socket = accept(); 
new thread(socket); 
}

但是创建线程是一个重量级开销,一个线程处理一个socket的读写以及业务逻辑,依然是重量级的,并且线程内部的读写和业务逻辑还是阻塞的。而且性能也下降很厉害,系统能支持稍稍线程就只能处理多少个socket,多的socket依然在排队(早期tomcat就有这个问题)。

  1. Reactor模式(把线程功能粒度细分)
    1)既然一个线程做建立连接,读写,以及业务逻辑过于繁重,那就把这三个过程给剥离开,拆分成更细粒度:
  • 把所有socket的连接功能请求处理放在一起统一处理;
  • 把所有socket请求的数据都放到系统缓冲区中;
  • 把所有缓冲区中的数据分发到不同的通道中(channel);
  • 不同的通道(channel)事先已经关联了对应的事件(event);当有数据进入channel时,就会触发相应的时间event;
  • 选择器(selector)不停轮询检查是否有event发生;
  • 如果有,那么就调用相应的handler处理器进行处理;
  • 如果没有,就阻塞;

交互图如下:


capture_20190729145426349.jpg

2) 上述是单线程处理,在handler中依然会存在可能非常耗时的业务逻辑和IO处理,比如数据库查询,文件读写等等,那么基于此,可以在handler中开启线程池来处理:


capture_20190729145426349.jpg

相关文章

网友评论

      本文标题:Reactor反应式模式(事件驱动模式)

      本文链接:https://www.haomeiwen.com/subject/bghtdctx.html