Reactor并发模型

1. Reactor模式

Reactor为“反应堆”,是一种事件驱动机制。Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口称为“回调函数”。

普通的函数处理机制为:调用某函数-> 函数执行, 主程序等待阻塞-> 函数将结果返回给主程序-> 主程序继续执行。

Reactor事件处理机制为:主程序将事件以及对应事件处理的方法在Reactor上进行注册, 如果相应的事件发生,Reactor将会主动调用事件注册的接口,即 回调函数. libevent即为封装了epoll并注册相应的事件(I/O读写,时间事件,信号事件)以及回调函数,实现的事件驱动的框架。

Reactor事件处理机制的编程模型,在Redis中也得到了很好的运用,Redis中基于I/O多路复用(mutiplexing) 开发Reactor事件处理机制,监听多个套接字的AE_READABLE读,AE_WRITABLE写事件。读事件绑定读操作和具体执行命令的操作函数,写事件绑定命令回复的操作函数。

2. Reactor架构

Reactor架构模式允许事件驱动的应用通过多路分发的机制去处理来自不同客户端的多个请求。

Reactor核心的事件处理流程,有如下几个关键组件:

事件(事件源)
linux上为文件描述符,handler即为注册在特定事件上的程序,事件发生通常在linux下为I/O事件,由操作系统触发。

Reactor(反应器)
事件管理的接口,内部使用event demultiplexer注册,注销事件;并运行事件循环,当有事件进入"就绪"状态时,调用注册事件的回调函数处理事件。

class Reactor {
public:
    int register_handler(EventHandler *pHandler, int event);

    int remove_handler(EventHandler *pHandler, int event);

    void handle_events(timeval *ptv);
}

Event demultiplexer(事件多路分发机制)
由操作系统提供的I/O多路复用的机制,例如select, epoll. 程序首先将handler(事件源)以及对应的事件注册到event demultiplexer上;当有事件到达时,event demultiplexer就会发出通知,通知Reactor调用事件处理程序进行处理。

Event Handler(事件处理程序)
事件处理程序提供了一组接口,在Reactor相应的事件发生时调用,执行相应的事件处理,通常会绑定一个有效的handler

class Event_Handler {
public:
    // events maybe read/write/timeout/close .etc
    virtual void handle_events(int events) = 0;

    virtual HANDLE get_handle() = 0;
}

传统线程池 vx. 事件驱动模型

对于传统的线程池模型来说只能每个对于每个请求使用一个单独的线程去处理,这就导致了当请求增加时过多了线程上下文切换,出现了性能上的瓶颈。

事件驱动的模型如下图,充分的利用linux select epoll模型,并注册相应的回调函数对于不同的事件,根据I/O多路复用的机制,实现了高并发,和高可扩展性。

posted @ 2024-04-20 20:14  longRookie  阅读(11)  评论(0编辑  收藏  举报
最简单即最美
有了信仰,自己要坚持努力 2017.07.09 21:34