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