如何在不同的事件循环中启动客户端?
How do I launch clients on different event loops?
我正在创建一个测试应用程序,它假设与服务器有很多连接。当我从我的 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 信息 [vert.x-eventloop-thread-0] MainVerticle:已连接 - Thread[vert.x-eventloop-thread-0, 5,主要] io.vertx.core.impl.EventLoopContext@150049b3
始终在同一线程上....如何在不同的事件循环上启动连接
首先,从单个主机创建多个连接是错误的。在服务器超载之前,您可能会在客户端计算机上遇到瓶颈。
其次,创建自己的负载测试工具是错误的。已经有优秀的工具可用,例如 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
另请注意,您实际上不需要为此使用协程。
我正在创建一个测试应用程序,它假设与服务器有很多连接。当我从我的 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 信息 [vert.x-eventloop-thread-0] MainVerticle:已连接 - Thread[vert.x-eventloop-thread-0, 5,主要] io.vertx.core.impl.EventLoopContext@150049b3
始终在同一线程上....如何在不同的事件循环上启动连接
首先,从单个主机创建多个连接是错误的。在服务器超载之前,您可能会在客户端计算机上遇到瓶颈。
其次,创建自己的负载测试工具是错误的。已经有优秀的工具可用,例如 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
另请注意,您实际上不需要为此使用协程。