Reactor and Multi-Reactor

在前文中我们经常提到Vert.x APIs是事件驱动的,也就是说Vert.x会尽可能的让handlers处理所有的事件。

大多数情况下,Vert.x会通过一个叫做事件轮训(event loop)的线程来调用你定义的handlers、并且因为在你的程序和Vert.x中是非阻塞的,所以event loop可以无障碍的分发不同的事件到不同的handlers并且保证事件分发必达。

也正是因为非阻塞,事件轮询机制可以在很短的时间内分发大量事件,比方说一个事件轮询可以很快的处理数以千计的HTTP请求。

我们把这个模式叫做Reactor Pattern。(我叫反应堆)Node.js中也使用了这种设计模式。

在一个简单的反应堆实现中,包含一个永不停止的事件轮训线程不停的向各个handlers分发事件。

但是这样的简单设计的问题在于,一次有且只能有一个内核跑这个反应堆。打比方说如果你想要你的单线程反应堆程序(比如一个Node.js程序)扩展运行到你的多核心服务器上,那么你可能需要管理多个不同的进程来做到这件事。

这里Vert.x有一些不同,我们会在一个实例中管理多个轮训事件而不是单个的。默认情况下机器的核心数是我们维护的轮训事件个数,但是这也是可以被复写的。

这也意味着不像Node.js,单个进程的Vert.x程序可以自由扩展到你的服务器上。

我们把这个模式称为多维反应堆模式,这样叫也是为了和单线程反应堆模式作区分。

尽管一个Vert.x实例维护多个轮训事件,单这不意味着某一个handler会被并发执行,大多数情况下,同一个handler都会被同一个轮训时间调用只执行。(Worker verticles除外)

results matching ""

    No results matching ""