1. 基本概念
1.1 背景
为了处理Web请求,有以下两种架构处理方式
1.1.1 基于线程的架构
也就是一个连接一个线程,即BIO的方式
优点:
可以隔离每个请求,请求之间互不影响
缺点:
严重依赖于线程,虽然线程相比于进程轻量级,但还是很占用资源
线程的创建和销毁成本很高(可以通过线程池和有界阻塞队列优化)
线程本身占用较大的内存
线程的切换成本是很高的
容易造成锯齿状的系统负载
无法解决C10K问题
适用场景
适用于连接数目比较小且固定的架构
1.1.2 事件驱动架构
通过事件驱动的方法可以将线程与连接分开,连接只将线程用于特定回调或程序的事件处理。
Reactor是事件驱动架构的一种实现技术。
简单来说,它使用单线程事件循环对资源发出的事件进行阻塞,并将其分配给相应的处理程序和回调。
只要注册了事件的处理程序和回调来处理它们,就不需要阻塞I / O。事件是指实例,例如新的传入连接,可以读取,可以写入等。这些处理程序/回调可以在多核环境中利用线程池。
优点
事件处理器之间高度解耦,扩展性好
性能较好,因为事件的异步本质,不易产生阻塞
缺点
开发相对复杂
1.2 Reactor的概念
1.2.1 Reactor模式的组成部分:
Reactor
负责响应IO事件,当检测到一个新的事件,将其发送给相应的Handler去处理;
对应的实现有Java的Selector
Handler
处理程序执行与I / O事件有关的实际工作。
1.2.2 优点
响应快,不必为单个事件处理所阻塞,虽然Reactor本身依然是同步的;
编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;
可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源;
可复用性