一 reactor的前世今生
高性能IO绕不开Reactor模式,NIO是Java对Reactor模式的实践,而大多数IO相关组件如Netty、Redis则是NIO的实践。个人觉得AKKA框架也是reactor的实践,包括公司以前用的actor编程框架。
- 最开始的网络编程
while(true){
socket = accept();
handle(socket)
}
可以看到是完全阻塞处理的
- 做个线程优化,对于产生的socket用新的线程来处理
while(true){
socket = accept();
new thread(socket);
}
但是创建线程是一个重量级开销,一个线程处理一个socket的读写以及业务逻辑,依然是重量级的,并且线程内部的读写和业务逻辑还是阻塞的。而且性能也下降很厉害,系统能支持稍稍线程就只能处理多少个socket,多的socket依然在排队(早期tomcat就有这个问题)。
- Reactor模式(把线程功能粒度细分)
1)既然一个线程做建立连接,读写,以及业务逻辑过于繁重,那就把这三个过程给剥离开,拆分成更细粒度:
- 把所有socket的连接功能请求处理放在一起统一处理;
- 把所有socket请求的数据都放到系统缓冲区中;
- 把所有缓冲区中的数据分发到不同的通道中(channel);
- 不同的通道(channel)事先已经关联了对应的事件(event);当有数据进入channel时,就会触发相应的时间event;
- 选择器(selector)不停轮询检查是否有event发生;
- 如果有,那么就调用相应的handler处理器进行处理;
- 如果没有,就阻塞;
交互图如下:
capture_20190729145426349.jpg
2) 上述是单线程处理,在handler中依然会存在可能非常耗时的业务逻辑和IO处理,比如数据库查询,文件读写等等,那么基于此,可以在handler中开启线程池来处理:
capture_20190729145426349.jpg














网友评论