【问题标题】:Does Vert.x has real concurrency for single verticles?Vert.x 对单个 Verticle 有真正的并发性吗?
【发布时间】:2013-07-21 04:10:37
【问题描述】:

这个问题可能看起来像一个 troll,但实际上它是关于 vert.x 如何管理并发性,因为 verticle 本身在专用线程中运行。

让我们看看这个用Java编写的简单的vert.x http服务器:

import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.platform.Verticle;

public class Server extends Verticle {
    public void start() {
        vertx.createHttpServer().requestHandler(new Handler<HttpServerRequest>() {
           public void handle(HttpServerRequest req) {
                req.response().end("Hello");
           }
        }).listen(8080);
    }
}

据我了解文档,整个文件代表一个垂直。所以在专用的verticle线程中调用了start方法,到目前为止一切都很好。但是 requestHandler 在哪里调用?如果正是在这个线程上调用它,我看不出它比 node.js 更好的地方。

我对 Netty 非常熟悉,它是 vert.x 所基于的网络/并发库。 每个传入的连接都映射到一个可以很好扩展的专用线程。那么..这是否意味着传入的连接也代表垂直?但是,Verticle 实例“Server”如何与那些客户端通信呢?事实上我会说这个概念和 Node.js 一样有限。

请帮助我正确理解这些概念!

问候, 克里斯

【问题讨论】:

  • 在 netty 中,线程和连接之间没有固定的映射——这实际上是它相对于经典 java.io 同步 I/O 的关键优势。只有当有实际工作要做时,才会从线程池中招募线程。
  • 我认为 Verticle 的一个关键原则是每个事件都由单个线程提供服务(或者至少特定 Verticle 的每个事件都是顺序执行的)。所以,不,Vert.x 对单个 Verticle 有并发,这就是它的重点。

标签: java asynchronous concurrency netty vert.x


【解决方案1】:

正如您对自己的正确回答,vertex 确实使用异步非阻塞编程(如 node.js),因此您不能执行阻塞操作,否则会阻止整个(应用程序)世界转动。

您可以通过生成更多(n=CPU 核心)verticle 实例来扩展服务器,每个实例都尝试侦听相同的 TCP/HTTP 端口。

与 node.js 相比,它的亮点在于 JVM 本身是多线程的,这为您提供了更多优势(从运行时的角度来看,不包括 Java 等的类型安全等):

  • 多线程(跨垂直)通信虽然仍受限于线程安全的 Actor-like 模型,但不需要 IPC(进程间通信)在垂直之间传递消息 - 一切都发生在同一个进程、同一个内存区域内。这比 node.js 在新系统进程中生成每个分叉任务并使用 IPC 进行通信要快
  • 能够在同一 JVM 进程中执行计算繁重和/或阻塞任务:http://vertx.io/docs/vertx-core/java/#blocking_codehttp://vertx.io/docs/vertx-core/java/#worker_verticles
  • HotSpot JVM 的速度与 V8 相比 :)

【讨论】:

  • 另外请注意,V8 从未打算在服务器端使用,nodejs 只是在某个时候出现,JavaScript 对于原始性能来说是一个非常糟糕的起点。 JVM 总是在性能上与 C/C++ 竞争,并且在服务器端使用历史悠久,这就是它现在相当快的原因:cubrid.org/blog/inside-vertx-comparison-with-nodejs
【解决方案2】:

每个verticle都是单线程的,在启动时vertx子系统会为那个verticle分配一个事件循环。该verticle中的每个代码都将在该事件循环中执行。下次你应该在http://groups.google.com/forum/#!forum/vertx提问,群里很热闹,你的问题很可能会立即得到答复。

【讨论】:

    【解决方案3】:

    我曾与一位非常参与 vert.x 的人交谈过,他告诉我,我对“并发”问题的看法基本上是正确的。

    但是:他向我展示了文档中的一个部分,我完全错过了其中详细解释了“扩展服务器”的部分。

    基本概念是,当您编写一个 Verticle 时,您只有单核性能。但是可以使用 -instance 参数启动 vert.x 平台,该参数定义了运行给定 Verticle 的实例数。 Vert.x 在后台做了一些魔术,因此我的服务器的 10 个实例不会尝试打开 10 个服务器套接字,而是实际上打开了一个。这样 vert.x 即使对于单个 Verticle 也是水平可扩展的。

    这真是一个很棒的概念,尤其是一个很棒的框架!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多