0
Environment: Mac osx lion
Grails version: 2.1.0
Java: 1.7.0_08-ea

Bootstrap.groovy 内で組み込みモードで vertx を起動し、複数のブラウザーを介して同じ Websocket エンドポイントをヒットしようとすると、要求がキューに入れられます。

そのため、リクエストのタイミングに応じて、1 つのリクエストが実行された後、次のリクエストがハンドラーに入ります。

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

また

BootStrap.groovy (ウェブソケット):

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

4 に答える 4

1

ブルースマンが言うように、各バーティカルは独自のスレッドになります。ハードウェアの複数のコアにまたがってバーティクルを拡張し、より多くのマシンでクラスター化することもできます。ただし、これにより、同時リクエストを受け入れる容量が追加されます。

リアルタイム アプリをプログラミングするときは、ブロックを回避するために、できるだけ早く応答を構築するように努める必要があります。操作に時間がかかると思われる場合は、次のモデルを検討してください。

  1. リクエストをする
  2. タスクを worker verticle に渡し、このタスクに (たとえば) UUID を割り当てて、それを応答に入れます。発信者は、作業が進行中であることを認識し、非常に迅速に応答を受け取ります
  3. ワーカーがタスクを終了すると、割り当てられた UUID を使用してイベント バスに通知を配置します。
  4. 呼び出し元は、イベント バスでタスクの結果を確認します。

これは通常、websockets、sockjs などを介して Web アプリケーションで行われます。

このようにして、ブロックせずに何千ものリクエストを受け入れることができます。また、クライアントは UI をブロックすることなく結果を受け取ります。

于 2012-09-09T16:51:54.903 に答える
1

vertx の親切な人々から:

def server = vertx.createHttpServer() は実際には verticle であり、verticle はシングル スレッド プロセスです

于 2012-09-07T19:37:07.870 に答える
0

Vert.xは、JVMを使用して、いわゆる「マルチリアクターパターン」を作成します。これは、パフォーマンスを向上させるために変更されたリアクターパターンです。

私が理解している限り、各バーティクルに独自のスレッドがあるということは真実ではありません。実際、各バーティクルは常に同じイベントループによって提供されますが、より多くのバーティクルを同じイベントループにバインドでき、複数のイベントループが存在する可能性があります。イベントループは基本的にスレッドであるため、少数のスレッドが多くのバーティクルにサービスを提供する必要があります。

私は埋め込みモードでvert.xを使用しませんでした(そして主な概念が変更されたかどうかはわかりません)が、ジョブのために多くのバーティクルをインスタンス化する方がはるかに優れているはずです

よろしく、カルロ

于 2012-10-23T21:00:12.380 に答える
0

前に述べたように、Vertx の概念はリアクター パターンに基づいています。つまり、単一のインスタンスには少なくとも 1 つの単一スレッドのイベント ループがあり、イベントを順番に処理します。ここで、リクエスト処理は複数のイベントで構成される場合があります。ここでのポイントは、リクエストと各イベントをノンブロッキング ルーチンで処理することです。

たとえば、Web Socket メッセージを待機する場合、リクエストは一時停止され、メッセージが発生した場合は復帰します。ファイル IO、ネットワーク IO、DB アクセスのように、メッセージに対して何をするにしても、非ブロッキングであるため非同期である必要があります。Vertx は、このような非同期フローを構築するために使用する必要がある基本的な要素を提供します: バッファー、ポンプ、タイマー、イベントバス。

まとめると、絶対にブロックしないでください。の使用はsleep(10000)概念を殺します。本当に実行を停止する必要がある場合は、代わりにVertX のタイマーを使用してください。

于 2014-04-02T10:15:52.047 に答える