現在、アプリケーションの起動時に、単一の verticle をデプロイして を呼び出してcreateHttpServer(serverOptions)
います。
閉じた接続イベントを処理するために をセットアップしました。これrequest().connection().closeHandler
は主に、クライアントがリクエストをキャンセルすることを決定したときに、そのリクエストの実行を停止するためです。
ただし、同じ verticle でそのハンドラーを設定すると、closeHandler
同期コードの実行が終了してからコードを実行するように見え、データベースが Future および非同期ハンドラーを介して応答するのを待っています。
その代わりに、新しい HTTP リクエストごとにワーカー バーティクルをデプロイすると、実行が適切に中断されてcloseHandler
コードが実行されます。
私が理解しているように、HttpServer は、新しいバーティクルを展開しなくても一度に多くのリクエストを処理できるため、リクエストのスケーラビリティを独自に処理することになっています。基本的に、これは、アプリケーションが本格的に稼働すると、スレッドの負荷やその性質に影響を与えるハックな回避策のように思えます。だから私の質問は:
これはこれを行う正しい方法ですか?
そうでない場合、従うべき正しい方法またはパラダイムは何ですか?
頂点の実行をそれ自体の頂点とその内部からキャンセルするにはどうすればよいですcloseHandler
か? 実行をキャンセルするということは、完了を待っているすべての Future を含めることを意味します。
この複数バーティクル アプローチを実行するときに、closeHandler が非同期でしか実行されないのはなぜですか? 通常の方法を使用し、割り当てられたスレッド プールを使用して単純にリクエストを実行すると、イベント ループがそのキューを終了するまで closeHandler の実行が延期されます。これを非同期で行う必要があります。