Java Vert.x对于单个垂直体是否具有真正的并发性?

Java Vert.x对于单个垂直体是否具有真正的并发性?,java,asynchronous,concurrency,netty,vert.x,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 Ve

这个问题看起来像一个巨魔,但实际上是关于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);
    }
}
import org.vertx.java.core.Handler;
导入org.vertx.java.core.http.HttpServerRequest;
导入org.vertx.java.platform.Verticle;
公共类服务器扩展了Verticle{
公开作废开始(){
createHttpServer().requestHandler(新处理程序(){
公共无效句柄(HttpServerRequest请求){
请求响应()结束(“你好”);
}
}).听(8080);
}
}
据我所知,这些文档中的整个文件都是垂直的。因此,在专用的垂直线程中调用start方法,到目前为止还不错。但是requestHandler在哪里被调用?如果在这个线程上调用它,我看不出它比node.js更好

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

请帮助我正确理解概念

问候,,
Chris

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

但是:他给我看了文档中的一个部分,我完全没有看到其中对“扩展服务器”的详细解释

基本概念是,当你写一个垂直的时候,你只有单核心的性能。但是可以使用-instance参数启动vert.x平台,该参数定义了一个给定verticle运行的实例数量。Vert.x在幕后发挥了一点魔力,这样我的服务器的10个实例就不会试图打开10个服务器套接字,而是打开一个。这样vert.x就可以水平扩展,即使对于单个垂直体也是如此


这真是一个伟大的概念,尤其是一个伟大的框架

每个垂直轴都是单线程的,启动时vertx子系统会为该垂直轴分配一个事件循环。垂直循环中的每个代码都将在该事件循环中执行。下次你应该在中提问时,小组非常活跃,你的问题很可能会立即得到回答。

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

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

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

  • 多线程(跨垂直)通信虽然仍被限制为线程安全的Actor-like模型,但不需要IPC(进程间通信)在垂直之间传递消息——所有事情都发生在同一进程、同一内存区域内。这比node.js在新系统进程中生成每个分叉任务并使用IPC进行通信要快
  • 能够在同一JVM进程中执行计算繁重和/或阻塞任务:或
  • 热点JVM与V8相比的速度:)

在netty中,线程和连接之间没有固定的映射,这实际上是它相对于经典的java.io同步I/O的主要优势。只有在有实际工作要做的时候,线程才从线程池中招募。我认为verticle的一个关键原则是每个事件都由单个线程提供服务(或至少特定垂直面的每个事件都是按顺序执行的)。因此,不,Vert.x没有针对单个verticle的并发性,这就是它的要点。还要注意,V8从来没有打算在服务器端使用,nodejs只是在某个时候发生的,JavaScript对于原始性能来说是一个非常糟糕的起点。JVM在性能方面总是与C/C++竞争,并且在服务器端有很长的历史使用,这就是为什么它现在相当快的原因: