你知道为什么对grails中嵌入的vertx的请求是同步排队的吗

你知道为什么对grails中嵌入的vertx的请求是同步排队的吗,grails,websocket,vert.x,grails-2.1,Grails,Websocket,Vert.x,Grails 2.1,如果我在Bootstrap.groovy中以嵌入式模式启动vertx,并尝试通过多个浏览器访问同一websocket端点,请求就会排队 因此,根据请求的时间,在一个请求执行完毕后,下一个请求进入处理程序 我在websocket和SockJs上都试过,发现两者的行为都是一样的 BootStrap.groovy(SockJs): javascript: def vertx = Vertx.newVertx() def server = vertx.createHttpServer()

如果我在Bootstrap.groovy中以嵌入式模式启动vertx,并尝试通过多个浏览器访问同一websocket端点,请求就会排队

因此,根据请求的时间,在一个请求执行完毕后,下一个请求进入处理程序

我在websocket和SockJs上都试过,发现两者的行为都是一样的

BootStrap.groovy(SockJs):

javascript:

    def vertx = Vertx.newVertx()
    def server = vertx.createHttpServer()
    def sockJSServer = vertx.createSockJSServer(server)
    def config = ["prefix": "/eventbus"]

    sockJSServer.installApp(config) { sock ->
      sleep(10000)      
    }
    server.listen(8088)
javascript

    def vertx = Vertx.newVertx()
    def server = vertx.createHttpServer()
    server.setAcceptBacklog(10000);
    server.websocketHandler { ws ->
        println('**received websocket request')
        sleep(10000)
    }.listen(8088)

来自vertx的热心人:


def server=vertx.createHttpServer()实际上是一个垂直进程,而垂直进程是一个单线程进程

正如bluesman所说,每个垂直进程都有自己的线程。您可以跨越硬件中的核心,甚至用更多的机器将它们聚集在一起。但这增加了同时接受请求的能力

在编写实时应用程序时,我们应该尽可能快地构建响应,以避免阻塞。如果你认为你的手术可以是时间密集型的,请考虑这个模型:

  • 提出请求
  • 将任务传递给worker verticle,并为该任务分配UUID(例如),然后将其放入响应中。调用者现在知道工作正在进行中,并很快收到响应
  • 当工作者结束任务时,使用分配的UUID在事件总线中放置通知
  • 调用方检查事件总线以获取任务结果
  • 这通常是在web应用程序vía websockets、sockjs等中完成的


    通过这种方式,您可以在不阻塞的情况下接受数千个请求。客户端将在不阻塞UI的情况下接收结果。

    Vert.x使用JVM创建所谓的“多反应器模式”,即修改后的反应器模式,以提高性能

    据我所知,并非每个垂直体都有自己的线程:事实上,每个垂直体总是由相同的事件循环提供服务,但更多垂直体可以与相同的事件循环绑定,并且可以有多个事件循环。一个事件循环基本上是一个线程,所以很少有线程可以服务于许多垂直链接

    我没有在嵌入式模式下使用vert.x(我也不知道主要概念是否改变),但是您应该更好地为工作实例化许多Verticle

    问候,,
    Carlo

    如前所述,Vertx概念基于反应器模式,这意味着单个实例至少有一个单线程事件循环,并按顺序处理事件。现在,请求处理可能由几个事件组成,这里的要点是使用非阻塞例程为请求和每个事件提供服务

    例如,当您等待Web套接字消息时,请求应暂停,如果出现消息,请求将被唤醒。无论您对消息做什么,都应该是非阻塞的,因此是异步的,就像任何文件IO、网络IO、数据库访问一样。Vertx提供了构建这种异步流所需的基本元素:缓冲区、泵、计时器和事件总线


    总而言之,永远不要阻塞。使用
    sleep(10000)
    扼杀了这个概念。如果您真的需要停止执行,请改用。

    我不确定这是grails问题还是vertx问题。
    <script>
    
        function initializeSocket(message) {
                console.log('initializing web socket');
                var socket = new SockJS("http://localhost:8088/eventbus");
                socket.onmessage = function(event) {
                    console.log("received message");
                }
                socket.onopen = function() {
                    console.log("start socket");
                    socket.send(message);
                }
                socket.onclose = function() {
                    console.log("closing socket");
                }
        }
    
        def vertx = Vertx.newVertx()
        def server = vertx.createHttpServer()
        server.setAcceptBacklog(10000);
        server.websocketHandler { ws ->
            println('**received websocket request')
            sleep(10000)
        }.listen(8088)
    
    socket = new WebSocket("ws://localhost:8088/ffff");
                socket.onmessage = function(event) {
                    console.log("message received");
                }
                socket.onopen = function() {
                         console.log("socket opened")
                    socket.send(message);
                }
                socket.onclose = function() {
                    console.log("closing socket")
                }