Vertx缩放每个线程的实例数

Jav*_*edi 3 java scaling multithreading vert.x

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

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

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

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

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

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

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

$ java -jar retrievever.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上有一个类似问题的问题: 我可以在Vert.x HTTP请求队列上设置容量吗?

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

问题3:

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

我很感激提前帮忙!

tse*_*ont 17

你误解了文档.

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

请参阅事件总线部分.

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

请参阅多反应堆模式,黄金法则运行阻止代码

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

请参见Verticles

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

请参见Verticle实例数

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

我相信这回答了你的三个问题.