Vertx 缩放每个线程的实例数

Vertx scaling the number of instances per thread

Vert.x 是一个用于在 JVM 上构建响应式应用程序的工具包。

我想将 vertx 用于基于 JVM 的可自动扩展 RESTful 后端 API。

到目前为止,我从文档中发现,它默认采用您机器中的核心数量,假设您有 N 个核心并为每个核心创建 N 个线程,每个线程都是一个事件总线,每个线程都包含顶点实例。 问题来了,Vertx 是如何控制实例数的?基于负载压力?

关于控制 Verticles 数量的事情 运行ning within a given thread 我仍然不明白。 请帮助澄清这件事。 假设机器有 4 个内核,我写了两个 类 扩展为 AbstractVerticle:

1) 让一个成为一些数据库数据检索器(我们称它为 RETRIEVER 或 "R")

2) 另一个让我们说是一些转换器(我们称它为 CONVERTER 或 "C")

现在我 运行 使用 vertx 或编译 运行:

$ java -jar retriever.jar

$ java -jar converter.jar

因为我们有 4 个内核,所以在启动时 Vertx 将为每个内核创建 4 个线程。

问题#1:

默认情况下,每个线程中有多少个检索器和转换器实例?我猜这是每个线程一个实例? 正确的?所以我们将有 4 个核心,总​​共 4 个检索器实例和 4 个实例。转换器?正确吗?

问题#2:

如果随着对 RETRIEVER ("R") 和 COVERTER ("C") 调用次数的增加而增加负载压力 (从 1.000 到 1.000.000 次调用)Vertx 会自动管理处理增加的系统调用次数所需的 "R" 和 "C" 实例的数量吗?

在Whosebug上有一个类似问题的问题:

Jordan Halterman 建议:"Note also that you can scale your HTTP server across multiple verticle instances in order to handle more requests. In this case you can either use static variables or shared data to share a semaphore across the instances."

问题#3:

但是您究竟如何扩展您的 Verticle 实例以处理更多请求?我在文档中找不到这个。

非常感谢您的帮助!

你误解了文档。

首先,有一个事件总线(当 Vert.x 在集群模式下启动时,它在 Vert.x 个实例之间共享)。它的作用是允许您的 Verticle 之间以消息传递方式进行通信。

参见 The Event Bus 部分。

然后Vert.x中有不同类型的线程:事件循环线程和工作线程。默认情况下,Vert.x 创建与机器上的内核一样多的事件循环线程,以及一个包含 20 个工作线程的池。事件循环线程用于处理异步事件(读取文件缓冲区、接收消息等)。工作线程用于执行应用程序的阻塞部分。

Multi-Reactor pattern, The Golden Rule and Running Blocking Code

Verticle 是 Vert.x 部署单元。 Verticles 共有三种类型,但您应该知道的两种是 "standard" Verticle 和 "worker" Verticles。标准 Verticle 在部署时会分配一个事件循环线程。无论您在 Verticle 中处理哪种类型的事件,都将由这个单一的事件循环线程处理。 Worker Verticle 保证一次由单个工作线程执行。每次可能不是同一个工作线程,但永远不会有两个工作线程并行处理工作垂直事件。

Verticles

最终,要扩展 Vert.x 应用程序,您需要部署 Verticle 的多个实例。对于标准 Verticle,每个实例都会分配一个不同的事件循环,这样您就可以跨核心进行扩展。

Number of Verticles Instances

Vert.x 不会自动为您调整 Verticles 的数量。不过,这是您可以使用 Vert.x 监控工具构建的东西。

我相信这会回答您的三个问题。