Vertx缩放每个线程的实例数

时间:2016-11-20 22:06:38

标签: java multithreading scaling vert.x

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

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

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

关于控制使用给定线程运行的Verticle数量的这个事情我仍然没有得到。 请帮忙澄清这件事。 假设机器有4个核心,我编写了两个扩展为AbstractVerticle的类:

1)让一个人成为DB数据检索器(让我们称之为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”实例的数量吗?

在stackoverflow上有一个类似问题的问题: Can I set a capacity on the Vert.x HTTP request queue?

Jordan Halterman建议:“另请注意,您可以跨多个Verticle实例扩展HTTP服务器以处理更多请求。在这种情况下,您可以使用静态变量或共享数据来跨实例共享信号量。”< / p>

问题#3:

但是,如何缩放Verticle实例以处理更多请求呢?我在文档中找不到这个。

我很感激您的帮助!

1 个答案:

答案 0 :(得分:14)

你误解了文档。

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

请参阅The Event Bus部分。

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

请参阅Multi-Reactor patternThe Golden RuleRunning Blocking Code

Verticle是Vert.x的部署单位。有三种类型的Verticle,但你应该知道的是&#34;标准&#34; Verticle和&#34; worker&#34; verticles。标准Verticle在部署时会被分配一个事件循环线程。您在Verticle中处理的任何类型事件都将由此单个事件循环线程处理。保证工作者Verticle一次由单个工作线程执行。它可能不是每次都是相同的工作线程,但从不两个工作线程将并行处理工作者Verticle事件。

请参阅Verticles

最后,要扩展Vert.x应用程序,可以部署多个Verticle实例。对于标准Verticle,每个实例将分配不同的事件循环,以便您可以扩展核心。

请参阅Number of Verticles Instances

Vert.x不会自动调整Verticle的数量。这是您可以使用Vert.x监视工具构建的。

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