Verticle实例数和工作池大小共存的目的是什么

What's the purpose of Verticle instance number and worker pool size coexist

我对这两个选项感到困惑,似乎只有一个就足够了。具有多个工作线程的 1 个实例或只有一个工作线程的多个实例可以消耗所有 cpu 个核心。

部署多个实例并且每个实例有多个工作线程的目的是什么?这似乎没有意义。

在我针对vertx 3.9做了一些测试后,我发现它的线程模型是独一无二的。 Vert.x 可以保证部署的非 worker Verticle 对象总是 运行 在同一个线程中,即使是像 Handler<AsyncResult> 这样的回调处理程序。因此,如果您只部署一个实例 Verticle,则只有一个线程可以 运行 代码属于该 Verticle。如果verticle是worker,callback handlder将在不同的线程(worker线程池大小> 1)上运行,但是,vertx在它上面同步,线程安全仍然得到保证。除此之外,工作线程池的大小影响executeBlocking,如果order参数为false,代码将没有线程安全并发。如果 order 为真,代码将被一个指定的线程运行。

结论是:对于非worker Verticle,扩展的唯一方法是部署多个Verticle实例。对于 worker verticle,一个具有合适的 worker 线程池大小的实例就足够了。当然也可以部署多个实例,但是不会带来额外的效果。

为了解决Verticle实例之间的通信(运行不同线程, 竞争条件的风险),它引入事件总线来解耦。它试图做的就是让用户代码可以并发,而无需将多线程知识的海洋潜入太深。然而,弱点是显而易见的:wrap 太厚(netty--vertx--(kotlin 协程))并且 doc 太简短。如果用户想要配置“这会导致竞争条件吗?”那将是噩梦,会浪费很多时间来弄清楚。如果你不能掌握netty,想更轻松地并发,试试golang。 vertx+kotlin 隐藏了太多内部的东西,竞争条件可能会导致你的 jvm 进程崩溃...

你的问题就像在问“如果有连接池大小,为什么还要打开多个连接?”

很明显,一个是可用线程池中每种类型的 Verticle 的数量 运行,另一个是池的总大小,它转化为 [=14] 的并发 Verticle 实例的数量=] 同时。我不知道这对你来说是否清楚,但如果不是,你可能需要重新学习线程的基础知识。