问题可能看起来像一个巨魔,但实际上是关于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一样有限。
请帮我理解正确的概念!
此致 克里斯
答案 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的类型安全性等):