サンプルのPoCプロジェクトで、単純な一般的なシナリオでいくつかのブロッキング/非ブロッキングソリューションをテストします。
現在の(ブロッキング)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 で公開されているすべてのソース
Spring-Webfluxバージョン5.0.0.BUILD-SNAPSHOTをもたらすバージョン2.0.0.BUILD-SNAPSHOTでspring-boot-starter-webfluxを使用して単純なSpringBootアプリケーションを作成しました。これは、Spring Core、Beans、Contextなどにも同じです。
5.0 RC4のリリース後、この問題は発生しなくなりました。この問題は、reactor-nettyとreactor-coreの接続プーリングに関連していました。
Spring Boot2.0.0.M4でもテストしました。すべてが正常に表示されます。