Vert.x架构学习之Reactor模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kavu1/article/details/83926441

前言

学习Vert.x之前,我们首先需要了解一下几个概念,Reactor设计模式就是其中一个。

一、Reactor模式简介

我们知道对于应用服务器,通常会涉及到对文件系统、数据库系统或者网络进行IO操作,由于cpu的运行速度远大于IO的速度,所以会发生这种情况:CPU可能会因为IO的操作而阻塞。我们当然不希望这种情况的发生,因为这大大降低了CPU的效率,因此,引进了多现程或多进程进行处理,即多个线程绑定多个IO事件,这样虽然可以提高CPU的效率,但仍然存在进程切换带来的弊端。

于是便引入了Reactor模式,首先,它是基于事件驱动,应用服务首先向一个中间人注册一个回调(event handler)进行注册,然后中间人轮询在其上注册过的服务,当有IO就绪时,中间人产生一个事件,并通知绑定的handler进行处理,这种回调体现了"好莱坞原则"(“Don’t call us, we’ll call you”),在IOC(控制反转)原则中也有相似的体现。这个中间人就是Reactor。

通俗的来说,在Reactor模式中,应用程序不是主动的调用某个API完成处理,而是逆置了事件处理流程,应用程序需要提供相应的事件接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口,通过注册的接口完成具体的事件处理。

二、.模式组成及处理流程
1、模式组成

Reactor模式由事件源、事件反应器、事件分离器、事件处理器等组件组成。
事件源(handle):由操作系统提供,用于识别每一个事件,如Socket描述符、文件描述符等。在服务端系统中用一个整数表示。该事件可能来自外部,如来自客户端的连接请求、数据等。也可能来自内部,如定时器事件。

  • 事件反应器(reactor):定义和应用程序控制事件调度,以及应用程序注册、删除事件处理器和相关描述符相关的接口。它是事件处理器的调度核心,使用事件分离器来等待事件的发生。一旦事件发生,反应器先是分离每个事件,然后调度具体事件的事件处理器中的回调函数处理事件。

  • 事件分离器(demultiplexer):是一个有操作系统提供的I/O复用函数,在此我们选用epoll。用来等待一个或多个事件的发生。调用者将会被阻塞,直到分离器分离的描述符集上有事件发生。

  • 事件处理器(even handler):事件处理程序提供了一组接口,每个接口对应了一种类型的事件,供reactor在相应的事件发生时调用,执行相应的事件处理。一般每个具体的事件处理器总是会绑定一个有效的描述符句柄,用来识别事件和服务。

2、处理流程

处理流程主要分为两个部分,事件注册部分和事件分发部分 ;

下面具体看一下Reactor结构图

扫描二维码关注公众号,回复: 4007276 查看本文章

在这里插入图片描述

在事件注册部分,应用程序首先将期待注册的套接字描述符作为事件源,并将描述符和该事件对应的事件处理回调函数封装到具体的事件处理器中,并将该事件处理器注册到事件反应器(Initialization Dispatcher)中。事件反应器接收到事件后,进行相应处理,并将注册信息再次注册到事件分离器epoll中。最后在epoll分离器中,通过epoll_ctl进行添加描述符及其事件,并层层返回注册结果。

在事件处理部分,首先事件反应器通过调用事件分离器的epoll_wait,使线程阻塞等待注册事件发生。此时如果某注册事件发生,epoll_wait将会返回,并将包含该注册事件在内的事件集返回给事件反应器。反应器接收到该事件后,根据该事件源找到该事件的事件处理器,并判断事件类型,根据事件类型在该事件处理器调用之前注册时封装的具体回调函数,在这个具体回调函数中完成事件处理。

猜你喜欢

转载自blog.csdn.net/kavu1/article/details/83926441
今日推荐