在网上看了很多reactor 模式,每个都是各有千秋,这里我写一下自己对reactor 模式感悟。


1. Reactor模式是什么

反应器设计模式(Reactor pattern)是一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序的事件设计模式。当客户端请求抵达后,服务处理程序使用多路分配策略,由一个非阻塞的线程来接收所有的请求,然后派发这些请求至相关的工作线程进行处理。

2.什么场景下使用Reactor模式?

对于高并发系统,常会使用Reactor模式,其代替了常用的多线程处理方式,节省系统的资源,提高系统的吞吐量。

3.Reactor模式简介

Reactor模式也叫反应器模式,大多数IO相关组件如Netty、Redis在使用的IO模式,为什么需要这种模式,它是如何设计来解决高性能并发的呢?

4. 多线程IO的致命缺陷

最原始的网络编程思路就是服务器用一个while循环,不断监听端口是否有新的套接字连接,如果有,那么就调用一个处理函数处理,类似:

while(true){socket = accept();handle(socket)}

这种方法的最大问题是无法并发,效率太低,如果当前的请求没有处理完,那么后面的请求只能被阻塞,服务器的吞吐量太低。

之后,想到了使用多线程,也就是很经典的connection per thread,每一个连接用一个线程处理,类似:

package com.crazymakercircle.iodemo.base;import com.crazymakercircle.config.SystemConfig;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;class BasicModel implements Runnable {public void run() {try {ServerSocket ss = new ServerSocket(SystemConfig.SOCKET_SERVER_PORT);while (!Thread.interrupted())new Thread(new Handler(ss.accept())).start();//创建新线程来handle// or, single-threaded, or a thread pool} catch (IOException ex) { /* ... */ }}static class Handler implements Runnable {final Socket socket;Handler(Socket s) { socket = s; }public void run() {try {byte[] input = new byte[SystemConfig.INPUT_SIZE];socket.getInputStream().read(input);byte[] output = process(input);socket.getOutputStream().write(output);} catch (IOException ex) { /* ... */ }}private byte[] process(byte[] input) {byte[] output=null;/* ... */return output;}}
}

对于每一个请求都分发给一个线程,每个线程中都独自处理上面的流程。

tomcat服务器的早期版本确实是这样实现的。

  • 多线程并发模式,一个连接一个线程的优点是:

一定程度上极大地提高了服务器的吞吐量,因为之前的请求在read阻塞以后,不会影响到后续的请求,因为他们在不同的线程中。这也是为什么通常会讲“一个线程只能对应一个socket”的原因。另外有个问题,如果一个线程中对应多个socket连接不行吗?语法上确实可以,但是实际上没有用,每一个socket都是阻塞的,所以在一个线程里只能处理一个socket,就算accept了多个也没用,前一个socket被阻塞了,后面的是无法被执行到的。

  • 多线程并发模式,一个连接一个线程的缺点是:

缺点在于资源要求太高,系统中创建线程是需要比较高的系统资源的,如果连接数太高,系统无法承受,而且,线程的反复创建-销毁也需要代价。

改进方法是:

采用基于事件驱动的设计,当有事件触发时,才会调用处理器进行数据处理。使用Reactor模式,对线程的数量进行控制,一个线程处理大量的事件。

什么是 reactor 模式相关推荐

  1. Reactor模式与Proactor模式

    博主一脚刚踏进分布式的大门(看<分布式Java应用>,如果大家有啥推荐的书欢迎留言~),发现书中对NIO采用的Reactor模式.AIO采用的Proactor模式一笔带过,好奇心趋势我找了 ...

  2. 高性能IO设计中的Reactor模式与Proactor模式

    为什么80%的码农都做不了架构师?>>>    在高性能的IO设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proacto ...

  3. 高性能IO之Reactor模式

    讲到高性能IO绕不开Reactor模式,它是大多数IO相关组件如Netty.Redis在使用的IO模式,为什么需要这种模式,它是如何设计来解决高性能并发的呢? 最最原始的网络编程思路就是服务器用一个w ...

  4. swing的gui是通过何种模式进行事件响应与监听_【Vert.x准备篇2】C10K问题与Reactor模式...

    C10K问题是1999年一个叫Dan Kegel的美国人提出的概念,其中C为concurrently, 10K指的是1万个网络连接, 结合起来意为如何能够做到并发处理1万个连接. 这里首先要澄清一下, ...

  5. 高性能IO -Reactor模式的实现

    2019独角兽企业重金招聘Python工程师标准>>> 在了解Reactor模式之前, 首先了解什么是NIO. java.nio全称java non-blocking IO 即非阻塞 ...

  6. 【Netty】反应器 Reactor 模式 ( 单反应器 Reactor 单线程 | 单反应器 Reactor 多线程 )

    文章目录 一. 反应器 ( Reactor ) 模式 二. 反应器 ( Reactor ) 模式两大组件 三. 单反应器 ( Reactor ) 单线程 四. 单反应器 ( Reactor ) 单线程 ...

  7. 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )

    文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...

  8. Java进阶(五)Java I/O模型从BIO到NIO和Reactor模式

    本文介绍了Java中的四种I/O模型,同步阻塞,同步非阻塞,多路复用,异步阻塞.同时将NIO和BIO进行了对比,并详细分析了基于NIO的Reactor模式,包括经典单线程模型以及多线程模式和多Reac ...

  9. libevent之Reactor模式详解

    转自:http://blog.csdn.net/sparkliang/article/details/4957667 前面讲到,整个libevent本身就是一个Reactor,因此本节将专门对Reac ...

  10. ACE - Reactor模式源码剖析及具体实现(大量源码慎入)

    原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于 ...

最新文章

  1. 摘自一个读者读后rework的感受
  2. 「x is All You Need」,当学术论文开始标题党……
  3. 灰色预测原理及JAVA实现
  4. [洛谷3812]【模板】线性基
  5. UVA10125和集
  6. UINavigationController使用的一些技巧
  7. easyUI的combobox选中无法显示
  8. 使用CMake编译freeglut-3.0.0的静态库
  9. Java Web应用程序的SecureLogin
  10. 解决: 网站访问报错 AccessDenied (阿里云 OSS + CDN )
  11. android时间戳字体,Android获取当前时间戳?
  12. C#调用VC的DLL的接口函数参数类型转换一览表
  13. QuickTest Professionar 快捷键
  14. 创意视觉应用︱基于深度学习的CVaaS计算机视觉即服务案例(Computer Vision as a Service)
  15. 给大家推荐五款常用的思维导图APP
  16. python绘制旭日图
  17. 用sql查询姓名和身份证_查询,更新和身份
  18. tabIndex 和 aria注意点
  19. 英国经济学专业哪些院校比较好?
  20. 30个Python简单小项目

热门文章

  1. 调音台使用基础-通道条、信号流简介
  2. 排序法学习之插入排序(python3实现)
  3. access和wps哪个一样_wps word和office的区别
  4. Wireshark软件使用
  5. 啥都不说了,今天就是要送书!
  6. 选取一段代码块一下子都回退或前进空一格的快捷键
  7. 微信支付-APP支付
  8. SQL语法 自然连接 外连接 内连接
  9. 00后学习微积分,推荐访问袁萌专栏
  10. Wayland协议了解