gpt4 book ai didi

vert.x - Vertx 网络服务器仅使用一个事件循环线程,而 16 个可用

转载 作者:行者123 更新时间:2023-12-05 00:12:49 24 4
gpt4 key购买 nike

我使用 Vert.x v3.5.1。
有最简单的代码示例:

vertx.createHttpServer()
.requestHandler(anyRouter::accept)
.listen(8080);

在我的例子中,事件循环组的大小是 16,所以我希望我的请求会影响 16 个线程。服务器已成功启动,但仅在一个线程中工作。 (我使用不同的 tcp-connections 发送请求,所以保持事件不是这里的原因。)
类(class) HttpServerImpl包含 httpHandlerMgr并且这个管理器处理一个事件循环池(名为 availableWorkers )。在调试期间,我看到这个池只包含一个 worker 。

使用 Verticle 模型并不能解决问题,仍然没有使用所有线程。

如果我在循环中多次创建服务器,它会有所帮助。因此,我有许多受影响的线程和一台共享服务器。但它看起来像解决方法。

问题是如何创建使用所有可用事件循环线程的 Web 服务器?

下面使用 Verticle 实现

因此,该实现使用了一半的可用线程(8 个线程)。但我希望它使用 16 :)
public static void main(String[] args) throws Exception {
int eventLoopSize = 16;
Vertx vertx = new VertxOptions().setEventLoopPoolSize(eventLoopSize);
for (int i=0;i<eventLoopSize; i++) {
vertx.deployVerticle(new MyServer(vertx), deploymentOptions);
}
}

public class MyServer implements Verticle {
final Vertx vertx;
public MyServer(Vertx vertx) {
this.vertx = vertx;
}

@Override
void init(Vertx vertx, Context context) {
vertx.createHttpServer()
.requestHandler(anyRouter::accept)
.listen(8080);
}
}

最佳答案

只涉及一个线程,这正是事件循环模型。我推荐观看 Philip Roberts: What the heck is the event loop anyway? | JSConf EU 2014 .示例适用于浏览器,但概念与 Vert.x 或 Node 等服务器端事件循环系统相同。

但是,使用 Vert.x,您通常将代码组织在 Verticle 中(想想小型服务)。每个 Verticle 都分配了一个事件循环,但您可以部署多个实例。这就是您如何使用 CPU 的所有内核。如果您是 Java 程序员并且是第一次编写 Vert.x 应用程序,我建议您阅读此 guide .

至于将您的 Verticle 扩展到所有核心,问题在于当您自己实例化 Verticle 时,您实际上创建了单独的部署,并且无法保证使用不同的事件循环。

Specifying number of verticle instances 中所述,您必须使用垂直名称:

When deploying a verticle using a verticle name, you can specify the number of verticle instances that you want to deploy:

DeploymentOptions options = new DeploymentOptions().setInstances(16);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);

This is useful for scaling easily across multiple cores. For example you might have a web-server verticle to deploy and multiple cores on your machine, so you want to deploy multiple instances to utilise all the cores.

关于vert.x - Vertx 网络服务器仅使用一个事件循环线程,而 16 个可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49775238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com