反应堆模式

1、概念

  一、定义

  反应堆模式是一种对象行为类的设计模式,对同步事件分拣和派发。它是处理并发I/O比较常见的一种模式,用于同步I/O。html

  其中心思想是将全部要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上;一旦有I/O事件到来或者是准备就绪,多路复用器返回并将相应的I/O事件分发到对应的处理器中。react

  二、Reactor事件处理机制

    Reactor是一种事件驱动机制,和普通函数的不一样之处在于:应用程序不是主动的调用某个API完成处理,Reactor逆置了事件处理流程,应用程序须要提供相应的接口并注册到Reactor上,若是相应的时间发生,Reactor将主动调用应用程序注册的接口(这些接口又被称为"回调函数")。下面是事件驱动机制的模型图:设计模式

  

  事件驱动(回调)就是应用业务向一个中间人注册一个回调(event handler),当I/O就绪后,就向这个中间人产生一个事件,并通知此handler进行处理。这个中间人是由一个不断等待和循环的单独线程来承担,它接受全部的handler的注册,并负责向操做系统查询IO是否就绪在就绪后就调用指定的handler进行处理。这个中间人的名字就就叫作Reactor。数组

  三、优势

  Reactor模式是编写高性能网络服务器的必备技术,主要有如下优势:服务器

  • 相应快,没必要为单个同步事件所阻塞,虽然Reactor自己也是同步的
  • 避免了多线程/进程的的切换开销
  • 可扩展性,能够方便的经过增长Reactor实例个数来充分利用CPU资源

2、反应堆模式组成

  

  

  一、Handler事件源

  Handler表明操做系统管理的资源,包括:网络链接、打开的文件、同步对象等等。事件能够来自外部,如客户端的链接请求、数据等,也能够来自内部,如定时器事件。网络

  二、Synchronous event demultiplexer同步事件分离器(事件多路分发机制)

  由操做系统提供的I/O多路复用机制,例如select和epoll,程序首先将其关心的句柄(即事件源)及其事件注册到event demultiplexer上,当有事件到达时,event demultiplexer会发出通知“在已经注册的句柄集中,一个或者多个句柄的事件已经就绪”;程序收到通知后,就能够在非阻塞的状况下对事件进行处理了。多线程

  三、event Handler事件处理接口

  一个或多个模板函数组成的接口,描述了和应用程序相关的对某个事件的操做并发

  四、concrete event Handler具体的事件处理器

  事件处理接口的实现,实现了应用程序提供的某个服务函数

  五、Reactor反应器

  定义了一些接口,用于应用程序控制事件调度,以及应用程序注册、删除事件处理器和相关的描述符,是事件处理器的调度核心。Reactor管理器使用同步事件分离器来等待事件的发生。一旦事件发生,Reactor管理器先是分离每一个事件,而后调度事件处理器,最后调用相关的模 板函数来处理这个事件。性能

3、NIO中的Reactor模式

  NIO中Reactor的核心是Selector。下面是一个简单的示例:

public class Reactor implements Runnable
{
    Selector selector;
    public Reactor() throws IOException
    {
        selector = Selector.open();
    }
    public void run()
    {
        try
        {
            while (!Thread.interrupted())
            {
                // 循环,等待事件
                selector.select();
                Set selected = selector.selectedKeys();
                Iterator it = selected.iterator();
                while (it.hasNext())
                    // 调用handler,处理事件
                    dispatch((SelectionKey) (it.next()));
                selected.clear();
            }
        } catch (IOException ex)
        { /* ... */
        }
    }
    void dispatch(SelectionKey k)
    {
        Runnable r = (Runnable) (k.attachment());
        if (r != null)
            r.run();
    }
}

4、参考资料

  一、http://ifeve.com/netty-reactor-4/

  二、http://www.2cto.com/kf/201504/389198.html

相关文章
相关标签/搜索