8

这个问题可能看起来像一个巨魔,但它实际上是关于 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 一样有限。

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

问候,克里斯

4

3 回答 3

7

我和一个非常参与 vert.x 的人谈过,他告诉我,关于“并发”问题,我基本上是正确的。

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

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

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

于 2013-07-23T09:01:31.387 回答
1

每个 Verticle 都是单线程的,在启动时,vertx 子系统会为该 Verticle 分配一个事件循环。该verticle中的每个代码都将在该事件循环中执行。下次您应该在http://groups.google.com/forum/#!forum/vertx提问时,该小组非常活跃,您的问题很可能会立即得到回答。

于 2013-07-25T02:13:53.987 回答
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 相比的速度 :)
于 2017-06-04T16:31:03.397 回答