Kotlin 关于Web服务器的vert.x概念?
我不太明白vert.x是如何应用于Web服务器的 我所知道的webserver的概念是基于线程的Kotlin 关于Web服务器的vert.x概念?,kotlin,webserver,vert.x,vertx-verticle,Kotlin,Webserver,Vert.x,Vertx Verticle,我不太明白vert.x是如何应用于Web服务器的 我所知道的webserver的概念是基于线程的 您启动Web服务器,然后该服务器正在运行 然后,对于每个连接的客户机,您都会得到一个套接字,然后将其传递给自己的线程处理程序 然后线程处理程序处理该特定套接字的任务 因此,它清楚地定义了哪个线程为哪个套接字执行工作。 但是,对于每个套接字,您都需要一个新线程,从长远来看,这对于许多套接字来说是昂贵的 然后是vert.x提供的基于事件的概念。 据我所知,它无论如何应该是这样工作的: vertx.dep
vertx.deployVerticle(WebServer::class.java.name, DeploymentOptions().setInstances(4)
class WebServer: AbstractVerticle() {
lateinit var server: HttpServer
override fun start() {
server = vertx.createHttpServer(HttpServerOptions().setPort(1234).setHost("localhost"))
var router = Router.router(vertx);
router.route("/test").handler { routingContext ->
var response = routingContext.response();
response.end("Hello from my first HttpServer")
}
server.requestHandler(router).listen()
}
}
此Web服务器可以在Vertx实例中多次部署。看起来,每个Web服务器实例都有自己的线程。当我尝试连接100个客户端并用一个简单的响应进行回复时,似乎每个客户端都是同步处理的。因为当我在每个服务器处理程序中执行Thread.sleep语句时,每秒钟一个客户端都会得到一个响应。但是,所有服务器处理程序都应该开始1秒睡眠,然后在这段时间之后几乎以相同的方式回复所有客户端
这是启动100个客户端的代码:
fun main(){
Vertx.vertx().deployVerticle(object : AbstractVerticle(){
override fun start() {
for(i in 0 .. 100)
MyWebClient(vertx)
}
})
}
class MyWebClient(val vertx: Vertx) {
init {
println("Client starting ...")
val webClient = WebClient.create(vertx, WebClientOptions().setDefaultPort(1234).setDefaultHost("localhost"))
webClient.get("/test").send { ar ->
if(ar.succeeded()){
val response: HttpResponse<Buffer> = ar.result()
println("Received response with status code ${response.statusCode()} + ${response.body()}")
} else {
println("Something went wrong " + ar.cause().message)
}
}
}
}
fun main(){
Vertx.Vertx().deployVerticle(对象:AbstractVerticle()){
覆盖有趣的开始(){
对于(0..100中的i)
MyWebClient(vertx)
}
})
}
MyWebClient类(val vertx:vertx){
初始化{
println(“客户端启动…”)
val webClient=webClient.create(vertx,webclientations().setDefaultPort(1234.setDefaultHost(“localhost”))
webClient.get(“/test”).send{ar->
如果(ar.successed()){
val响应:HttpResponse=ar.result()
println(“收到状态代码为${response.statusCode()}+${response.body()}的响应”)
}否则{
println(“出错”+ar.cause().message)
}
}
}
}
有人知道这方面的解释吗?您的代码的问题是,默认情况下,Vert.x每个verticle最多只使用一个线程(如果verticle多于可用线程,则一个线程必须处理多个verticle) 因此,如果对单个verticle的单个实例执行100个请求,则请求由单个线程处理 为了解决您的问题,您应该部署verticle的多个实例,即
vertx.deployVerticle(MainVerticle::class.java.name, DeploymentOptions().setInstances(4))
执行此操作时,始终会在几乎相同的时间收到4个响应,因为verticle的4个实例正在运行,因此使用了4个线程
在Vert.x的早期版本中,如果不想设置特定数量的实例,也可以简单地为verticle配置多线程
vertx.deployVerticle(MainVerticle::class.java.name, DeploymentOptions().setWorker(true).setMultiThreaded(true))
但是,此功能已被弃用并替换为客户工作人员池
有关此主题的更多信息,我鼓励您查看这里有一些主要问题 执行此操作时:
class WebServer: AbstractVerticle() {
lateinit var server: HttpServer
override fun start() {
server = vertx.createHttpServer(HttpServerOptions().setPort(1234).setHost("localhost"))
...
}
}
然后像这样:
vertx.deployVerticle(WebServer::class.java.name, DeploymentOptions().setInstances(4)
您将获得4条垂直线,但其中只有一条将在端口上实际侦听。因此,您无法获得更多的并发性
其次,当您在Vert.x代码中使用Thread.sleep
时,您正在阻塞事件循环线程
第三,您的客户端测试是不正确的。创建WebClient非常昂贵,因此通过一个接一个地创建WebClient,实际上发出请求的速度非常慢。如果您真的想测试您的web应用程序,请使用类似于的方法来测试多线程请求,wrk和Apache的ab之间是否存在显著差异?
wrk
存在一些问题,您应该使用wrk2
或ab
。如果您对更多细节感兴趣,请单独提出一个问题。好的。我已经创建了一个单独的问题,请遵循。