Как запустить клиентов в разных циклах событий? - PullRequest
1 голос
/ 05 июня 2019

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

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

1 Ответ

0 голосов
/ 05 июня 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...