Reactor and Multi-Reactor

我们在前文中提到过Vert.x是基于事件驱动的,当Vert.x事件准备好之后,就会向事件传递给被设置的handler

在大多数情况下,Vert.x会使用一个称为event loop的线程来调用你的handler

鉴于Vert.x以及你的应用程序不会产生任何阻塞操作,event loop会快速地将事件分发到不同的handler

因为我们的任何操作都不会带来任何阻塞,因此一个event loop就可以在非常短的时间内,分发出去居多的事件。例如一个event loop就可以非常快速地处理数千个HTTP请求。

我们把这种模式称为Reactor Pattern.

你也许以前就听说过这种模式,例如Node.js就是这种模式的一种实现

在一个标准reactor实现中,会有一个单独的event loop线程进行可用事件轮询,只要有事件接听到,就将它发送到全部的handler上

但是这种实现有个小缺点,在任一时刻,它都会只运行在一个核心上,因此如果你想要你的单线程reactor应用程序在多核心服务器上进行拓展,那么你就需要启动并管理多个不同的reactor应用程序进程

但是Vert.x的工作模式与之不同。相比单线程event loop,每个Vertx实例都包含数个event loop. 在默认情况下,我们会根据所在机器的可用核心数来设置event loop数量,当然你也可以自己指定这个数量

我们把这种模式称为Multi-Reactor Pattern

注意:尽管Vertx实例会持有多个event loop,但是每一个handler都不会被并发执行, 而且在大多数情况下(工作者verticle除外),handler会被同一个event loop执行