2012-09-01 74 views
0
Environment: Mac osx lion 
Grails version: 2.1.0 
Java: 1.7.0_08-ea 

如果我開始在內部BootStrap.groovy中嵌入模式了vertx和嘗試打通過多個瀏覽器相同的WebSocket端點,請求得到排隊。爲什麼請求vertx嵌入Grails的任何想法被同步排隊

因此,根據請求的時間,在執行一個請求後,下一個請求進入處理程序。

我試過這兩個websocket和SockJs,並注意到兩者都有相同的行爲。

BootStrap.groovy中(SockJs):

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:

<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"); 
      } 
    } 

OR

BootStrap.groovy中(的WebSockets):

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

的javascript

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") 
      } 
+0

我不確定它是Grails問題還是vertx問題。 – bluesman

回答

1

從在vertx很有幫助人:

DEF服務器= vertx.createHttpServer()實際上是一個verticle和verticle是單線程處理

1

作爲bluesman說,每個Verticle進入它自己的線程。你可以在你的硬件中跨越核心,甚至可以用更多的機器來集羣它們。但是這增加了接受同時請求的能力。

在編寫實時應用程序時,我們應該嘗試儘快構建響應以避免阻塞。如果你認爲你的操作可能需要花費很長時間,考慮這一模式:

  1. 提出請求
  2. 傳遞任務工人verticle並分配這個任務的UUID(例如),並把它放進響應。呼叫者現在知道工作正在進行並且如此快地收到響應
  3. 當工作人員結束任務時,使用分配的UUID在事件總線中發出通知。
  4. 調用者檢查任務結果的事件總線。

這在Web應用程序tipically做然後通過WebSockets,sockjs等

這樣你能接受成千上萬的請求,而不會阻塞。客戶端會收到結果而不會阻止用戶界面。

0

Vert.x使用JVM創建一個所謂的「多反應堆模式」,這是一個反應堆模式被修改爲執行更好。

據我所知不是是真的,每個垂直有它自己的線程:事實是,每個垂直總是由相同的事件循環服務,但更多的垂直可以綁定相同的事件循環和那裏可以是多個事件循環。事件循環基本上是一個線程,所以很少的線程應該服務許多垂直線程。

我沒有在嵌入式模式下使用vert.x(我不知道如果主觀念的變化),但你應該執行更好的實例很多verticles作業

問候, 卡羅

0

如前所述,Vertx概念基於反應堆模式,這意味着單個實例至少有一個單線程事件循環並按順序處理事件。現在請求處理可能由幾個事件組成,這裏的要點是爲請求提供服務,而每個事件都使用非阻塞例程。

E.g.當你等待Web Socket消息時,請求應該被掛起,並且在消息被喚醒的時候。無論你如何處理消息,都應該是非阻塞的,因此是異步的,就像任何文件IO,聯網IO,數據庫訪問一樣。 Vertx提供了您應該用來構建異步流程的基本元素:緩衝區,泵,定時器,EventBus。

把它包起來 - 永遠不要阻塞。使用sleep(10000)殺死了這個概念。如果您確實需要停止執行,請改用VertX's Timers

相關問題