0

私は vertx と RxJava が初めてです。簡単なテストプログラムを実装しようとしています。ただし、このプログラムのダイナミクスを理解することはできません。一部のリクエストの応答に 10 秒以上かかるのはなぜですか?

以下は私のサンプルテストアプリケーションです

public class Test {

public static void main(String[] args) {

Vertx vertx = Vertx.vertx();
WebClient webClient = WebClient.create(vertx);

Observable < Object > google = hitURL("www.google.com", webClient);
Observable < Object > yahoo = hitURL("www.yahoo.com", webClient);

for (int i = 0; i < 100; i++) {
  google.repeat(100).subscribe(timeTaken -> {
    if ((Long) timeTaken > 10000) {
      System.out.println(timeTaken);
    }
  }, error -> {
    System.out.println(error.getMessage());
  });
  yahoo.repeat(100).subscribe(timeTaken -> {
    if ((Long) timeTaken > 10000) {
      System.out.println(timeTaken);
    }
  }, error -> {
    System.out.println(error.getMessage());
  });
}
}

public static Observable < Object > hitURL(String url, WebClient webClient) {
return Observable.create(emitter -> {
  Long l1 = System.currentTimeMillis();
  webClient.get(80, url, "").send(ar -> {
    if (ar.succeeded()) {
      Long elapsedTime = (System.currentTimeMillis() - l1);
      emitter.onNext(elapsedTime);
    } else {
      emitter.onError(ar.cause());
    }
    emitter.onComplete();
  });
});
}
}

私が知りたいのは、何が私の応答時間を遅くしているのかということです。

4

1 に答える 1

4

ここでの問題は、使用方法WebClientおよび/または「応答」時間を測定する方法にあるようです (ここで達成しようとしているものによって異なります)。

Vert.x のWebClientは、ほとんどの http クライアントと同様に、内部で制限されたサイズの接続プールを使用してリクエストを送信します。つまり、呼び出し.send(...)によって http 要求がすぐに開始されるとは限りません。代わりに、何らかのキューで使用可能な接続を待機する場合があります。測定値には、この潜在的な待ち時間が含まれます。

デフォルトのプール サイズは 5 のようです (少なくとも Vert.x の最新バージョンでは -ここで定義されています) が使用されており、すぐに 200 の http 要求が開始されます。ほとんどの場合、要求が利用可能な接続を待機することは驚くべきことではありません。

私が正しいかどうかをテストしたい場合は、プールサイズを増やしてみてください。

WebClient webClient = WebClient.create(vertx, new WebClientOptions().setMaxPoolSize(...));

于 2021-05-29T11:03:07.827 に答える