web-dev-qa-db-ja.com

Spring WebFluxWebClientの復元力とパフォーマンス

サンプルのPoCプロジェクトで、単純な一般的なシナリオでいくつかのブロッキング/非ブロッキングソリューションをテストします。

シナリオ:

  • 非常に遅いレストブロッキングエンドポイントがあります-各リクエストには200ミリ秒かかりました。
  • 他にも、この遅いエンドポイントを呼び出すクライアントアプリケーションがあります。

現在の(ブロッキング)Springブートクライアント(Tomcat)、Spring Boot 2.0(netty)をWebFlux(WebClient、Ratpack、Lagom)でテストしました。いずれの場合も、ガトリングテストの単純なシナリオ(100〜1000ユーザー/秒)によってクライアントアプリケーションに重点を置いています。

結果をSpringBoot(ブロッキングとノンブロッキング)と比較するために、参照ノンブロッキングioサーバーとしてratpackとlagomをテストしました。

Spring Boot 2.0テストを除いて、すべての場合で期待どおりの結果が得られます。負荷レベルが小さい場合にのみ機能しますが、それでも待ち時間が長くなります。負荷レベルが上がると、すべてのリクエストがタイムアウトになります。

WebClientの使用法:

@RestController
public class NonBlockingClientController {
private WebClient client = WebClient.create("http://localhost:9000");

@GetMapping("/client")
public Mono<String> getData() {
    return client.get()
            .uri("/routing")
            .accept(TEXT_PLAIN)
            .exchange()
            .then(response -> response.bodyToMono(String.class));
}
}

何がうまくいかないのか、現在のスナップショットバージョンがそれを機能させているのかわかりません。

https://github.com/rutkowskij/blocking-non-blocking-poc で公開されているすべてのソース

  • ブロッキングサービス-低速ブロッキングエンドポイント
  • non-blocking-client-Spring Boot2.0およびWebClientベースのクライアント

Spring-Webfluxバージョン5.0.0.BUILD-SNAPSHOTをもたらすバージョン2.0.0.BUILD-SNAPSHOTでspring-boot-starter-webfluxを使用して単純なSpringBootアプリケーションを作成しました。これは、Spring Core、Beans、Contextなどにも同じです。

16
Jakub Rutkowski

5.0 RC4のリリース後、この問題は発生しなくなりました。この問題は、reactor-nettyとreactor-coreの接続プーリングに関連していました。

Spring Boot2.0.0.M4でもテストしました。すべてが正常に表示されます。

詳細: http://jira.spring.io/browse/SPR-15584

8
Jakub Rutkowski