java - Vert.x 多线程网络套接字

标签 java vert.x

我有一个简单的 vert.x 应用程序:

public class Main {
public static void main(String[] args) {
    Vertx vertx = Vertx.vertx(new VertxOptions().setWorkerPoolSize(40).setInternalBlockingPoolSize(40));
    Router router = Router.router(vertx);
    long main_pid = Thread.currentThread().getId();
    Handler<ServerWebSocket> wsHandler = serverWebSocket -> {
        if(!serverWebSocket.path().equalsIgnoreCase("/ws")){
            serverWebSocket.reject();
        } else {
            long socket_pid = Thread.currentThread().getId();
            serverWebSocket.handler(buffer -> {
                String str = buffer.getString(0, buffer.length());
                long handler_pid = Thread.currentThread().getId();
                log.info("Got ws msg: " + str);
                String res = String.format("(req:%s)main:%d sock:%d handlr:%d", str, main_pid, socket_pid, handler_pid);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                serverWebSocket.writeFinalTextFrame(res);
            });
        }
    };
    vertx
        .createHttpServer()
        .websocketHandler(wsHandler)
        .listen(8080);
}
}

当我将此服务器与多个客户端连接时,我发现它在一个线程中工作。但我想并行处理每个客户端连接。我应该如何更改此代码才能做到这一点?

最佳答案

这个:

new VertxOptions().setWorkerPoolSize(40).setInternalBlockingPoolSize(40)

看起来您正在尝试创建自己的 HTTP 连接池,这可能不是您真正想要的。

Vert.x 和其他基于事件循环 的非阻塞框架的想法是,我们不尝试 1 线程 -> 1 connection affinity,而是,当当前由事件循环线程服务的请求正在等待 IO - 例如来自 DB 的响应 - 该事件循环线程被释放以服务于另一个连接。然后,这允许单个事件循环线程以类似并发的方式为多个连接提供服务。

如果你想充分利用你机器上的所有核心,并且你只打算运行一个verticle,那么在部署你的时候将实例数设置为核心数垂直。

浏览器

Vertx.vertx().deployVerticle("MyVerticle", new DeploymentOptions().setInstances(Runtime.getRuntime().availableProcessors()));

关于java - Vert.x 多线程网络套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36941393/

相关文章:

json - 将 JsonObject 映射到类字段的最佳方法

java - 无法识别的字段类未标记为可忽略

c# - 如何绘制 CDF 图?

java - 在 Java 中从 HTML 中提取信息(解析)的最简单方法

java - 异步和同步模式的并发

java - Vert.x 启动应用程序和配置文件的方式

java - 缺少依赖项版本 - io.vertx :vertx-stack-depchain:jar is missing 为 'dependencies.dependency.version'

java - 使用 Jedi 通过 Java 客户端从 Redis 服务器上的列表中删除字符串

java - 两个类制作同一个实例? java

java - 如何使用 https 将 spring-config-server 与 vertx 一起使用?