Как запустить клиентов в разных циклах событий?

Я создаю тестовое приложение, которое предполагает много подключений к серверу. Когда я создаю клиента из моего 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

Всегда в одном потоке.... Как запустить соединение в разных циклах событий

1 ответ

Решение

Прежде всего, создание множества соединений с одного хоста - ошибка. Вы попадете в узкое место на своем клиентском компьютере, вероятно, задолго до того, как перегрузите свой сервер.

Во-вторых, создание собственного инструмента нагрузочного тестирования - ошибка. Для этого уже есть отличные инструменты, такие как 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

Также обратите внимание, что вам на самом деле не нужно использовать сопрограммы для этого.

Другие вопросы по тегам