如何在没有 Verticals 的情况下垂直缩放 Vert.x?
How to vertically scale Vert.x without Verticals?
根据 Vert.x 文档 - 使用 Verticles 部署是 optional. If this is the case - how can I deploy say an HTTP server onto multiple event loops? Here's what I tried - also read the api docs 并且找不到任何东西:
Vertx vertx = Vertx.vertx(new VertxOptions().setEventLoopPoolSize(10));
HttpServerOptions options = new HttpServerOptions().setLogActivity(true);
for (int i = 0; i < 10; i++) {
vertx.createHttpServer(options).requestHandler(request -> {
request.response().end("Hello world");
}).listen(8081);
}
这似乎在第一个事件循环中创建了 10 个 HTTP 服务器,但我希望每个事件循环创建 1 个服务器。
这是我在日志中看到的内容 - 所有 eventloop-thread-0:
08:42:46.667 [vert.x-eventloop-thread-0] DEBUG
io.netty.handler.logging.LoggingHandler - [id: 0x0c651def,
L:/0:0:0:0:0:0:0:1:8081 - R:/0:0:0:0:0:0:0:1:50978] READ: 78B
08:42:46.805 [vert.x-eventloop-thread-0] DEBUG
io.netty.handler.logging.LoggingHandler - [id: 0xe050d078,
L:/0:0:0:0:0:0:0:1:8081 - R:/0:0:0:0:0:0:0:1:51000] READ: 78B
08:42:47.400 [vert.x-eventloop-thread-0] DEBUG
io.netty.handler.logging.LoggingHandler - [id: 0x22b626b8,
L:/0:0:0:0:0:0:0:1:8081 - R:/0:0:0:0:0:0:0:1:51002] READ: 78B
“可选”并不意味着“你可以,得到同样的好处”。 “可选”仅表示“您可以”。
Vert.x 有线程关联的概念。从同一个线程创建的 HTTP Server 将始终分配给同一个事件循环。否则你会遇到严重的线程安全问题。
您可以将上面的示例代码与以下代码进行比较:
Vertx vertx = Vertx.vertx();
HttpServerOptions options = new HttpServerOptions().setLogActivity(true);
// Spawn multiple threads, so EventLoops won't be bound to main
ExecutorService tp = Executors.newWorkStealingPool(10);
CountDownLatch l = new CountDownLatch(1);
for (int i = 0; i < 10; i++) {
tp.execute(() -> {
vertx.createHttpServer(options).requestHandler(request -> {
System.out.println(Thread.currentThread().getName());
// Slow the response somewhat
vertx.setTimer(1000, (h) -> {
request.response().end("Hello world");
});
}).listen(8081);
});
}
// Just wait here
l.await();
输出类似于:
vert.x-eventloop-thread-0
vert.x-eventloop-thread-1
vert.x-eventloop-thread-2
vert.x-eventloop-thread-0
那是因为每个事件循环线程现在都绑定到一个单独的执行线程。
根据 Vert.x 文档 - 使用 Verticles 部署是 optional. If this is the case - how can I deploy say an HTTP server onto multiple event loops? Here's what I tried - also read the api docs 并且找不到任何东西:
Vertx vertx = Vertx.vertx(new VertxOptions().setEventLoopPoolSize(10));
HttpServerOptions options = new HttpServerOptions().setLogActivity(true);
for (int i = 0; i < 10; i++) {
vertx.createHttpServer(options).requestHandler(request -> {
request.response().end("Hello world");
}).listen(8081);
}
这似乎在第一个事件循环中创建了 10 个 HTTP 服务器,但我希望每个事件循环创建 1 个服务器。
这是我在日志中看到的内容 - 所有 eventloop-thread-0:
08:42:46.667 [vert.x-eventloop-thread-0] DEBUG io.netty.handler.logging.LoggingHandler - [id: 0x0c651def, L:/0:0:0:0:0:0:0:1:8081 - R:/0:0:0:0:0:0:0:1:50978] READ: 78B
08:42:46.805 [vert.x-eventloop-thread-0] DEBUG io.netty.handler.logging.LoggingHandler - [id: 0xe050d078, L:/0:0:0:0:0:0:0:1:8081 - R:/0:0:0:0:0:0:0:1:51000] READ: 78B
08:42:47.400 [vert.x-eventloop-thread-0] DEBUG io.netty.handler.logging.LoggingHandler - [id: 0x22b626b8, L:/0:0:0:0:0:0:0:1:8081 - R:/0:0:0:0:0:0:0:1:51002] READ: 78B
“可选”并不意味着“你可以,得到同样的好处”。 “可选”仅表示“您可以”。
Vert.x 有线程关联的概念。从同一个线程创建的 HTTP Server 将始终分配给同一个事件循环。否则你会遇到严重的线程安全问题。
您可以将上面的示例代码与以下代码进行比较:
Vertx vertx = Vertx.vertx();
HttpServerOptions options = new HttpServerOptions().setLogActivity(true);
// Spawn multiple threads, so EventLoops won't be bound to main
ExecutorService tp = Executors.newWorkStealingPool(10);
CountDownLatch l = new CountDownLatch(1);
for (int i = 0; i < 10; i++) {
tp.execute(() -> {
vertx.createHttpServer(options).requestHandler(request -> {
System.out.println(Thread.currentThread().getName());
// Slow the response somewhat
vertx.setTimer(1000, (h) -> {
request.response().end("Hello world");
});
}).listen(8081);
});
}
// Just wait here
l.await();
输出类似于:
vert.x-eventloop-thread-0
vert.x-eventloop-thread-1
vert.x-eventloop-thread-2
vert.x-eventloop-thread-0
那是因为每个事件循环线程现在都绑定到一个单独的执行线程。