1、Reactor设计模式背景
- 解决什么问题:
- 该设计模式,是一种设计高性能服务器的设计模式,用于处理应用接收到的大量并发请求,基于事件的方式来做
- 设计模式来源:
- 计算机科学家:道格拉斯·C·施密特 ,著作有C++ Network Programming
- Reactor含义:
- The Reactor design pattern handles service requests that are delivered concurrently to an application by one or more clients.
- Reactor模式:用于处理应用接收到的大量并发请求
2、Reactor模式详解
- 计算机教授,主要研究并发编程和并发数据结构,是java并发库作者
2.1、传统方式痛点
- 图示:
-
- 代码说明:
- 每个请求用一个线程去处理(这里不用在意是用new thread或者线程池)
- 存在问题:IO线程和业务线程耦合在一起,当socket不可读的时候,整个线程就阻塞了
2.2、Reactor基础模式(单线程)
- 图示:
-
- 代码说明
- 在一个Selector里监听:accept、read、write事件,监听到后,在同一个线程内处理业务逻辑
- 注意:这里已经是基于事件的,不会阻塞IO读写(例如client一直不发请求)
- 单线程版本适用场景:瓶颈在网络IO的业务,业务计算很快(例如redis,都是内存计算)
- 缺点:
- 很明显,因为只有一个线程,所以当其中一个请求处理很慢,就会卡住后面的请求
2.3、Reactor工作线程池模式
- 图示:
-
- 代码说明:
-
- 可读的时候,将请求交给worker线程池处理
- 好处:请求之间不会相互影响,A请求慢不会卡住B请求
- 缺点:
- 只有一个线程去监听全部事件,accept事件和read,write事件没有拆分
- 当并发连接数多的时候,遍历处理read、write事件就耗时长,导致延迟处理accept事件
2.4、多个Reactor模式
- 图示
-
- 说明:
- 拆分Acceptor监听线程,readwriter监听线程(根据实际情况可以拆多个)
- tomcat的线程模型,类似这种方式