Vertx是否具有单个垂直的真正并发性?

时间:2013-07-22 12:16:07

标签: java asynchronous concurrency netty vert.x

问题可能看起来像一个巨魔,但实际上是关于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方法在专用的Verticle线程中调用,到目前为止一直很好。但是在哪里调用了requestHandler?如果在这个线程上调用它,我无法看到它比node.js更好。

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

请帮我理解正确的概念!

此致 克里斯

3 个答案:

答案 0 :(得分:7)

我和那些参与vert.x的人交谈过,他告诉我,我对“并发”问题基本上是正确的。

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

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

这真是一个伟大的概念,特别是一个伟大的框架!!

答案 1 :(得分:1)

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

答案 2 :(得分:1)

正确回答自己,顶点确实使用异步非阻塞编程(如node.js),因此您无法阻止操作,因为否则会阻止整个(应用程序)世界转动。

您可以按照正确的说明扩展服务器,方法是生成更多(n = CPU核心)Verticle实例,每个实例都尝试侦听相同的TCP / HTTP端口。

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

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