Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 关于Web服务器的vert.x概念?_Kotlin_Webserver_Vert.x_Vertx Verticle - Fatal编程技术网

Kotlin 关于Web服务器的vert.x概念?

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

我不太明白vert.x是如何应用于Web服务器的

我所知道的webserver的概念是基于线程的

  • 您启动Web服务器,然后该服务器正在运行
  • 然后,对于每个连接的客户机,您都会得到一个套接字,然后将其传递给自己的线程处理程序
  • 然后线程处理程序处理该特定套接字的任务
  • 因此,它清楚地定义了哪个线程为哪个套接字执行工作。 但是,对于每个套接字,您都需要一个新线程,从长远来看,这对于许多套接字来说是昂贵的

    然后是vert.x提供的基于事件的概念。 据我所知,它无论如何应该是这样工作的:

    vertx.deployVerticle(WebServer::class.java.name, DeploymentOptions().setInstances(4)
    
  • Vertx实例部署垂直体
  • Verticle在后台线程中运行,但不是每个Verticle都有自己的线程。例如,在一个Vertx实例中可能部署了1000个Verticle,但Vertx实例只处理8个线程(内核数*2)
  • 然后是事件循环。我不知道他们是怎么指垂直柱的。我读过,每个垂直轴都有2个事件循环,但我真的不知道它是如何工作的
  • 作为Web服务器示例:

    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
    。如果您对更多细节感兴趣,请单独提出一个问题。好的。我已经创建了一个单独的问题,请遵循。