【问题标题】:Can you run concurrent instances of a verticle on a single vert.x ? Are those instances thread-safe?你能在单个 vert.x 上运行一个 Verticle 的并发实例吗?这些实例是线程安全的吗?
【发布时间】:2023-02-09 07:19:48
【问题描述】:

我知道这个问题已经被问过了,但我认为它从来没有得到一个准确的答案。

Vert.x 能否在单个 Vert.x 上运行同一个 Verticle 的多个实例,这意味着单个 Verticle 可以在多个事件循环上运行?如果是这种情况,每个事件循环是否运行相同的处理程序实例或单独的处理程序实例,换句话说,同一个 Verticle 的多个实例是线程安全的并且不共享任何状态,或者是否存在并发问题?

根据 Vert.x 文档 -

即使 Vertx 实例维护多个事件循环,任何 特定的处理程序永远不会并发执行,并且在大多数情况下 cases(worker verticles除外)总是会被调用 使用完全相同的事件循环。

很难准确地说出它们的意思。

我试图弄清楚 Actor 模型和 Vert.x 在并发性和映射到线程方面的比较。到目前为止,Vert.x 似乎像 Actors 一样工作,其中 Verticle 是分配给单个线程的一组 Actors,可能唯一的区别是在 Vert.x 中,一段代码可以在其他地方同时运行(在同一个 Vert.x 上) ) 尽管可能作为具有自己状态的单独实例,但严格禁止使用 Actors,除非您将 Actor 复制为单独的类,然后它是相同的。

更新:似乎在单独的事件循环上运行的实例之间存在完全隔离的状态,因为每个实例都运行通过单独的类加载器加载的自己的实例,因此甚至不共享静态变量。

【问题讨论】:

    标签: concurrency thread-safety vert.x actor


    【解决方案1】:

    是的,vertx 可以运行同一个 Verticle 的多个实例。

    创建顶点实例时,它将创建一定数量的事件循环线程。默认情况下它是机器上 cpu 数量的 2 倍。

    部署的所有垂直行业都将多路复用到这些线程上。你可以在 4 个事件循环线程上有 100 个垂直。

    但是一旦为一个 Verticle 分配了一个线程,它将始终从该事件循环线程执行。

    如果你在某处有一个非原子/线程安全的全局变量,并且你在多个事件循环上有 Verticles - 从多个 Verticles 同时访问该变量是不安全的。但是在 Verticle 中,除非您启动自己的不同线程,否则一切都是线程安全的。

    但是,无论如何,这不是处理问题的方式。该应用程序应建模为垂直应用程序,然后应部署多个副本以利用您机器上的所有内核。

    Verticle 中的所有内容都可以被认为是线程安全的,因为它是单线程的。

    如果多个 Verticles 需要访问全局数据——那么使用共享数据、事件总线、锁定或任何其他并发友好的数据结构,如并发哈希映射。

    需要理解的基本概念是我希望我的代码像单线程一样运行并且安全,但我希望能够使用我机器上的所有内核。你是怎样做的?您可以通过部署 Verticle 的多个实例来实现。每个实例都是单线程的,但由于存在多个实例,它们将利用所有 cpu 内核。

    它类似于 node.js - node js 是单线程的,因此要利用机器上的所有内核,开发人员会部署进程的多个副本。 Jvm 具有真正的线程,因此我们在不同线程上部署多个副本,而不是多个 jvm/进程。

    就演员模型而言 - 可以将 Verticle 视为演员。您不必以这种方式建模,因为 vertx 是无敌的。消息通过事件总线在它们之间传递。与 akka 或 erlang 的 actor 模型不同,Verticles 是扁平的,没有层次结构或监督,您的用例可能需要也可能不需要。

    【讨论】:

    • 感谢你的回答。我假设你所说的全局是静态的。根据您的说法-事件循环中同一 Verticle 的实例之间没有共享状态,除了静态变量之外没有并发问题。
    • 如果您也以垂直方式启动新线程,则可能会遇到并发问题。
    • 是的,如果您同时显式启动一些线程,但我想这个想法是利用提供的执行上下文并将所有内容作为事件循环中的异步代码运行。
    • 是的,那你应该好好的
    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多