java - Vert.x 是否对单个 Verticle 具有真正的并发性?

标签 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 实例“服务器”如何与这些客户端通信呢?事实上,我会说这个概念与 Node.js 一样有限。

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

问候, 克里斯

最佳答案

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

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

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

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

关于java - Vert.x 是否对单个 Verticle 具有真正的并发性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17787339/

相关文章:

java - 平滑绘制的线条(类似铅笔的工具)java

java - 单个观察者没有调用 onError()

javascript - 如何为 angularjs 站点设置诺顿密封?

java - javax.swing.plaf.nimbus.ImageCache 中 ReentrantReadWriteLock 的用法

java - 丢失的更新-Java,Spring和JPA

Java 锁 : How equality check for Monitor locks is done in synchronized block?

java - 性能: Inner Interface vs separate Interface class

java - JSON 对象提取值

.net - PLINQ 有异步版本吗?

python - 通过回调传递数据