Reactor是由Schmidt, Douglas C提出的一种模式,在高并发服务器实现中广泛采用。改模式采用事件驱动方式,当事件出现时,后调用相应的事件处理代码(Event Handler)。

这个模式是高并发服务器的基础,如nginx和lighttpd。这两种对大并发,但每个请求处理都很快的场景非常适合。通常的web访问就是这个特点。

结构

包括了5个部分,其中handle和Synchronous Event Demultiplexer有OS实现。

Handles:

就是网络连接(connection),每个网络连接都由一个handle表示。

Event(事件)

ACCEPT_EVENT:表示收到连接请求

READ_EVENT:表示收到数据

WRITE_EVENT:表示socket可以足够的缓冲区,可以向其写入数据。

TIMEOUT_EVENT:超时。Java NIO不支持这个事件。

SIGNAL_EVENT:信号。Java NIO不支持这个事件。

CLOSE_EVENT:该socket被关闭。Java NIO不支持这个事件。

Event Handler

事件处理代码,该对象实例(instance)是和handle关联的。每个Event Handler处理一个handle上的事件。一般的服务器中至少有两种事件处理代码:一个是用来接收连接请求(accept event handler),响应ACCEPT_EVENT。,一个用来处理接受的请求(connection event handler),响应READ_EVENT和WRITE_EVENT。

Synchronous Event Demultiplexer(事件多路分离系统)

该模式的核心,等待handles上的事件。没有事件出现时,一直阻塞(blocking);当某个(某些)handles上有时间产生时,返回。这个是实现一般由操作系统提供,如linux的select、poll及epoll等。

Initiation Dispatcher

该对象负责管理Event Handlers(增加,删除等),当某个handle上有事件出现时,调用相应的

内部使用Synchronous Event Demultiplexer

reactor的论文中给出了实例代码

Logging_Acceptor是处理接收请求的event handler。

Logging_Handler是处理实际请求的event handler

Initiation_Dispatcher::instance是单利模式的Initiation Dispatcher

线程模型

论文中使用的是单线程模型,即一个线程同时处理接受请求和处理请求。该模型中,如果每个请求的处理时间较长,则会影响真个系统的吞吐率。

更为普遍的是使用多线程模型。多线程的基本方式是1:n。

1个线程用来接受连接请求,执行accept event handler。

其他的线程用来处理连接请求,执行connection event handler。n的数量可以根据运行情况动态调整。如果每个连接的处理非常快,可能一个线程就够了;如果处理的时间很长,则可能一个连接就要有一个线程。

java NIO

java nio就是依照reactor模式设计的。java nio中的主要抽象:

Selector:相当于Synchronous Event Demultiplexer

SelectionKey: 相当于event,和一个SocketChannel关联

SocketChannel:相当于handle

java nio中没有提供initial dispatcher的抽象,这部分功能需要用户自行实现。

java nio中没有提供event handler的抽象,这部分功能需要用户自行实现。

netty

作为API,java nio不会设计的很全面,只会提供基本的功能。对一般的用户来说,java nio提供的编程界面还是比较原始(pirmitive),不是很容易使用。netty是一个网络编程框架,在java nio的基础上提供了更高层的抽象。netty的编程比起nio有极大的简化。netty中提供了reactor的所有封装,用户在使用中只需实现event handler即可。

netty在event handler上又提供了一层抽象,ChannelPipeline和ChannelHandler。

ChannelPipeline类似于原来的event handler,用来处理连接请求。ChannelPipeline由若干个ChannelHandler构成,ChannelPipeline会分别调用这些ChannelHandler来处理连接请求。这种设计类似于servlet中的filter chain。所有的ChannelHandler和在一起,形成了处理链路。

netty同样提供了对线程模型的支持,具体可以参考netty的文档。

proactor和reactor的区别

主要区别是在处理连接请求时的方式:

reactor: 收到事件后,同步处理。该请求没有完成后,该线程不会再去处理其他请求。

proactor:收到事件,异步处理。该请求会执行异步调用(如异步读写文件等),然后该请求调用返回,该线程会继续执行其他的请求。但是第一个请求并没有处理完毕,当异步操作完成时,后有时间通知到第一个请求,完成处理。proactor的编程会比较复杂。

原文:http://blog.csdn.net/zhengleiguo/article/details/30829583

java nio proactor_reactor模式与java nio相关推荐

  1. java.awt.headless 模式(Linux, java.awt.headless and the DISPLAY environment variable)

    http://blog.chinaunix.net/uid-25098298-id-287544.html 1. 什么是 java.awt.headless? Headless模式是系统的一种配置模式 ...

  2. java interpreter_解释器模式(Interpreter)Java

    定义: 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 结构图: AbstractExpression解释器模式 ...

  3. java 调停者模式_[Java教程]《JAVA与模式》之调停者模式

    [Java教程]<JAVA与模式>之调停者模式 0 2012-06-20 12:00:09 在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: ...

  4. java语言执行模式,使用java.exe执行静默模式

    I would like to know if there is a way to execute the "java.exe" as a background process ( ...

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

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

  6. java reactor模式例子_JAVA BIO,NIO,Reactor模式总结

    传统同步阻塞I/O(BIO) 在NIO之前编写服务器使用的是同步阻塞I/O(Blocking I/O).下面是一个典型的线程池客服端服务器示例代码,这段代码在连接数急剧上升的情况下,这个服务器代码就会 ...

  7. 【Java IO模式】Java BIO NIO AIO总结

    一同步与异步阻塞与非阻塞 1同步与异步 2阻塞与非阻塞 3IO模式 二BIO 概念描述 特点 代码实现 三NIO 概念描述 特点 代码描述 四AIO 一.同步与异步.阻塞与非阻塞 1.同步与异步 同步 ...

  8. 【Java NIO】一文了解NIO

    [Java NIO]一文了解NIO Java NIO 1 背景介绍 在上一篇文章中我们介绍了Java基本IO,也就是阻塞式IO(BIO),在JDK1.4版本后推出了新的IO系统(NIO),也可以理解为 ...

  9. java用NIO实现文件传输_Java Nio 实现文件的传输

    使用Java Nio实现文件的传输 1.ServerSocket.java package ch2; import java.io.File; import java.io.FileNotFoundE ...

最新文章

  1. Linux日志 系统日志及分析
  2. TCP三次握手的原理及***手段
  3. 2013_chengdu_visit
  4. 水电图wp表示什么_装修水电工入门基础知识,刚入行不懂不用急?老师傅告诉你怎么做...
  5. ieda ts文件报错_使用TS开发微信小程序(1):环境搭建——VSCode+TS
  6. C语言---快速排序
  7. UI设计灵感|高级黑网页首图就该这样设计
  8. tensorflow Dataset API diff between make_initializable_iterator and make_one_shot_iterator
  9. 一文搞懂深度学习中常用的优化算法
  10. 删除无法读取源文件或磁盘的文件 删除系统找不到指定路径的文件
  11. 解决“更新pip版本竟将pip卸载了,提示No module named ‘pip‘”
  12. P5706 【深基2.例8】再分肥宅水
  13. CINTA:陪集与拉格朗日定理
  14. 计算机网络水晶头闪,网线水晶头坏了怎么办 小妙招一分钟解决你的问题
  15. [BZOJ5064]B-number
  16. 如何通过域名查询IP地址
  17. C++:实现量化exchangerate汇率测试实例
  18. EC20 centos7 调试_CentOS 7实现离线下载
  19. 111完美邮箱品牌域名——数字域名111.com
  20. EPICS记录参考1--EPICS概要

热门文章

  1. Python的三种格式化输出
  2. delphi实现两个目录路径的链接
  3. IE下 c00ce56e 错误竟然是nginx 字符设置的问题
  4. 2.25~当svn服务器ip地址变了怎么办?
  5. xcode 左侧导航栏 no finder results 问题的解决方法
  6. 努力将SQL Server像玩游戏一样熟练
  7. 【Scrum】2010.12.27
  8. Java程序员大神给初学者的学习方法路线建议
  9. Eclipse创建JavaWeb工程
  10. AI在汽车中的应用:实用深度学习