0

我正在创建一个测试应用程序,假设与服务器有很多连接。当我从我的 Verticle 创建一个客户端时,它总是在同一个线程上处理连接和消息。

当我创建我的verticle时,我设置了

options.setEventLoopPoolSize(4)

所以我希望它循环到 4 个事件循环,因为我想拥有数百万个连接。

我正在做

        launch {
            val socket = netClient.connectAwait(port, host)
            log.info().log("connected on - {} {}", Thread.currentThread(), Vertx.currentContext())
            socket.handler {
                log.info().log("{}", it)
            }
        }

2019-06-04 17:30:06,479 INFO [vert.x-eventloop-thread-0] MainVerticle:连接在 - Thread[vert.x-eventloop-thread-0,5,main] io.vertx.core.impl .EventLoopContext@150049b3

总是在同一个线程上......如何在不同的事件循环上启动连接

4

1 回答 1

0

首先,从单个主机创建多个连接是错误的。在服务器超载之前,您可能会在客户端机器上遇到瓶颈。

其次,创建自己的负载测试工具是错误的。已经有很好的工具可用,例如wrk,它解决了您将遇到的许多问题。

现在,到手头的问题。连接在事件循环的不同线程上启动。您可以看到它运行以下代码:

private const val port = 8443

fun main() {
    val counter = AtomicLong(0)
    val vertx = Vertx.vertx()
    val client = vertx.createNetClient()
    var timestamp = System.currentTimeMillis()
    vertx.createNetServer().connectHandler { ctx ->
        counter.getAndIncrement()
        if (System.currentTimeMillis() - timestamp > 1000) {
            println(counter.get())
            counter.set(0)
            timestamp = System.currentTimeMillis()
        }
        ctx.end()
    }.listen(port)

    println("Server started")

    ddos(client)
}

fun ddos(client: NetClient) {
    for (i in 0..999999) {
        client.connect(port, "localhost") {
            println(Thread.currentThread().name)
        }
    }
}

请注意,您还将获得更多线程:

vert.x-eventloop-thread-14
vert.x-eventloop-thread-12
vert.x-eventloop-thread-10
vert.x-eventloop-thread-14
vert.x-eventloop-thread-14
vert.x-eventloop-thread-10

另请注意,您实际上并不需要为此使用协程。

于 2019-06-05T13:37:00.077 回答