男人做想看的免费网站,郑州地铁app,自己做网站推广费用大,最好的做法文章目录 传统的阻塞式 I/OReactor 模式单 Reactor 单线程单Reactor多线程主从Reactor多线程 在目前的线程模型中一种是传统阻塞的I/O模型#xff0c;一种是Reactor线程模型。 传统的阻塞式 I/O
为了同时处理多个客户端的请求#xff0c;服务端为每一个连接都会分配一个新的… 文章目录 传统的阻塞式 I/OReactor 模式单 Reactor 单线程单Reactor多线程主从Reactor多线程 在目前的线程模型中一种是传统阻塞的I/O模型一种是Reactor线程模型。 传统的阻塞式 I/O
为了同时处理多个客户端的请求服务端为每一个连接都会分配一个新的线程处理。这个独立的线程完成数据的读写和业务处理。这虽然是“传统”的处理方式但是也是最经典的 IO 线程模型。示意图如下 该模型采用阻塞式 IO连接创建后如果当前线程暂时没有数据可读该线程会阻塞在 read 操作造成线程资源浪费。
当并发数很大就会创建大量的线程占用大量系统资源。
Reactor 模式
Reactor 模式针对传统 IO 的缺点提出了解决方案。
方案 1基于 I/O 复用模型。即多个连接共用一个阻塞对象当某个连接有新的数据准备好时操作系统通知应用程序线程从阻塞状态返回开始进行业务处理。
方案 2基于线程池复用线程资源不需要给每个连接创建一个线程。将连接完成后的业务处理任务分配给线程池中的线程进行处理。这样一个线程可以处理到多个客户端的业务。
总结一句话I/O 多路复用 线程池就是所谓的“Reactor 模式”的基本设计思想。其实我们前面 NIO 案例中的版本 1 的实现方式就有点这种味道只不过不是严格意义上的 Reactor 模式罢了。
目前常用的Netty、Redis、Memcached、Nignx都是基于Reactor模式实现的。
Reactor模型的核心 ReactorReactor 在一个单独的线程中运行负责监听和分发事件分发给适当的处理程序来对 I/O 事件做出反应。 Handlers完成实际 I/O 事件中数据的读写和要做的一系列业务处理。
Reactor模型根据Reactor的数量和处理资源线程池的数量不同又分为三种Reactor线程模型
单Reactor单线程单Reactor多线程主从Reactor多线程
单 Reactor 单线程 流程
Reactor 对象通过 Select 监控客户端请求事件收到事件后通过 Dispatch 进行分发。如果是建立连接请求事件则由 Acceptor 通过 Accept 处理连接请求然后创建一个 Handler 对象处理连接完成后的后续业务处理。如果不是建立连接事件则 Reactor 会分发调用连接对应的 Handler 来响应Handler 会完成 Read→业务处理→Send 的完整业务流程。
优点
模型简单没有多线程、进程通信、竞争的问题全部都在一个线程中完成。
缺点
性能问题只有一个线程无法完全发挥多核 CPU 的性能。Handler 在处理某个连接上的业务时整个进程无法处理其他连接事件很容易导致性能阻塞。可靠性问题线程意外终止或者进入死循环会导致整个系统通信模块不可用不能接收和处理外部消息造成节点故障。使用场景 客户端的数量有限业务处理非常快速。java原生nio就是这个模型。
单Reactor多线程 流程
Reactor 对象通过select 监控客户端请求事件, 收到事件后通过dispatch进行分发。如果建立连接请求, 则由Acceptor 通过accept 处理连接请求, 然后创建一个Handler对象处理完成连接后的各种事件。如果不是连接请求则由reactor分发调用连接对应的handler 来处理。handler 只负责响应事件不做具体的业务处理, 通过read 读取数据后会分发给后面的worker线程池的某个线程处理业务。worker 线程池会分配独立线程完成真正的业务并将结果返回给handler。handler收到响应后通过send 将结果返回给client。
优点
可以充分的利用多核cpu 的处理能力。
缺点
多线程数据共享和访问比较复杂 reactor 处理所有的事件的监听和响应在单线程运行 在高并发场景容易出现性能瓶颈.。
主从Reactor多线程 流程
Reactor主线程 MainReactor 对象通过select 监听连接事件, 收到事件后通过Acceptor 处理连接事件。当 Acceptor 处理连接事件后MainReactor 将连接分配给SubReactor 。subreactor 将连接加入到连接队列进行监听,并创建handler进行各种事件处理。当有新事件发生时 subreactor 就会调用对应的handler处理。handler 通过read 读取数据分发给后面的worker 线程处理。worker 线程池分配独立的worker 线程进行业务处理并返回结果。handler 收到响应的结果后再通过send 将结果返回给client。Reactor 主线程可以对应多个Reactor 子线程, 即MainRecator 可以关联多个SubReactor。
优点
父线程与子线程的数据交互简单职责明确父线程只需要接收新连接子线程完成后续的业务处理。父线程与子线程的数据交互简单Reactor 主线程只需要把新连接传给子线程子线程无需返回数据。
缺点
编程复杂度较高。
应用场景
这种模型在许多项目中广泛使用包括 Nginx 主从 Reactor 多进程模型Memcached 主从多线程Netty 主从多线程模型的支持。 引用 https://www.cnblogs.com/Maarten/p/15313801.html https://zhuanlan.zhihu.com/p/543661648