vert.x 实例
vert.x 实例是 vert.x api 的入口点,我们调用 vert.x 中的核心服务时,均要先获取 vert.x 实例,通过该实例来调用相应的服务,例如部署 verticle、创建 http server。
一个 JVM 中通常只有一个 vert.x 实例,也可有多个实例。每个 vert.x 实例有自己的事件循环(一个事件循环对应一个事件循环线程),其事件循环数量缺省是 cpu 核数的 2 倍(文档中提到缺省数量等于 cpu 核数,但经过测试发现 vert.x 3.1.0 版本中是 2 倍)。
verticle
verticle 是 vert.x 中的组件,可理解成 Java 中的 servlet、pojo bean 或 akka 中的 actor。一个组件可有多个实例。verticle 实例之间的通讯通过 Event Bus,发消息到 Event Bus。
verticle 可分为两种类型:标准 verticle 和 worker verticle。
标准 verticle
标准 verticle 运行在 vert.x 实例的事件循环线程中,也就是当有事件发生时,在 Event Loop 事件循环线程中回调 verticle 实例中的 event handler。
一个 vert.x 实例可有多个标准 verticle 实例,每个标准 verticle 实例中的 event handler 当事件发生时总是在一个固定的事件循环线程中被回调,因为在固定的单线程中运行,在一定程度上避免了竞争条件和死锁。标准 verticle(更确切的说是 verticle event handler 中的回调方法)不能阻塞事件循环。
worker verticle
worker verticle 在 background workers 线程池中执行,该线程池的大小缺省为 40。worker verticle 又可分成两种。一种是多线程 worker verticle,一个多线程 worker verticle 实例可在多个worker线程中并发执行;另一种是单线程 worker verticle,在同一时间只能有一个线程执行(串行执行),但在不同时间可被不同线程执行。
event bus
event bus 可理解为一个分布式的消息队列系统,支持点对点(队列)、发布-订阅(topic)、请求-响应模式。verticle 实例之间的事件均通过 event bus 进行传递,这些 verticle 实例可分布在不同的JVM或不同机器上,也可在用户的 web 浏览器上。如图4所示。
对可能阻塞事件循环的操作或任务,可调用 context 的 executeBlocking 方法,将操作放到 worker线程池中执行或通过 event bus 发消息触发 worker verticle 执行。