• reactor模式与java nio


    
    Reactor是由Schmidt, Douglas C提出的一种模式,在高并发server实现中广泛採用。

    改模式採用事件驱动方式,当事件出现时,后调用对应的事件处理代码(Event Handler)。


    这个模式是高并发server的基础。如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上的事件。一般的server中至少有两种事件处理代码:一个是用来接收连接请求(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),不是非常easy使用。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的编程会比較复杂。


  • 相关阅读:
    常用源代码管理工具与开发工具
    项目发布
    学期总结
    个人博客
    个人博客
    阅读笔记6
    阅读笔记5
    阅读笔记4
    团队代码
    团队代码
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6999247.html
Copyright © 2020-2023  润新知