3

在 Vert.x 应用程序中部署 Verticle 时,文档似乎非常不清楚 Verticle“实例”实际上是什么,以及它与线程和线程池的关系。事实上,与实际线程模型相关的任何事情都不清楚......

从文档中;

Vert.x 在这里的工作方式不同。每个 Vertx 实例都维护多个事件循环,而不是单个事件循环。默认情况下,我们根据机器上可用内核的数量来选择数字,但这可以被覆盖。

也来自文档;

要在 Vert.x 服务器中实例化的 Verticle 实例数。每个 Verticle 实例都是严格的单线程的,因此要跨可用内核扩展您的应用程序,您可能需要部署多个实例。如果省略,将部署单个实例。我们稍后将在本用户手册中详细讨论缩放。

假设我想部署一个简单的 REST API,它被编写为单个 Verticle,并且我想让它在可用的 CPU 内核上有效地扩展。我应该怎么办?

  • 我是否为每个 CPU 核心部署一个 Verticle 实例?
  • 我是否部署了单个垂直实例,至少根据文档的一部分,单个垂直实例已经维护了多个事件循环(因为我假设 1 个事件循环 = 1 个线程)?
  • 如果我部署 4 个 Verticle 实例,实际会创建/使用哪些线程和/或线程池?
4

1 回答 1

2

Vert.x 文档有这样一段:

Verticle 是由 Vert.x 部署和运行的代码块。一个 Vert.x 实例默认维护 N 个事件循环线程(其中 N 默认为 core*2)。

如果您想利用所有核心,则每个核心需要部署 2 个 Verticle。

标准 Verticle 在创建时被分配一个事件循环线程,并使用该事件循环调用 start 方法。当您从事件循环调用任何其他在核心 API 上获取处理程序的方法时,Vert.x 将保证这些处理程序在被调用时将在同一个事件循环上执行。

这意味着我们可以保证您的 Verticle 实例中的所有代码始终在同一个事件循环上执行(只要您不创建自己的线程并调用它!)。

当你部署一个 Verticle 时,它​​会被分配一个事件循环线程。这意味着在 Verticle 中编写的任何代码的执行将始终在部署 Verticle 的同一事件循环上执行。这使您可以很好地跨可用线程进行扩展。

于 2021-05-18T04:26:14.153 回答