Acabo de probar con un proyecto PoC de muestra algunas soluciones de bloqueo/no bloqueo en un escenario común simple.
He probado el cliente de arranque Spring (tomcat) actual (de bloqueo), Spring Boot 2.0 (netty) con WebFlux - WebClient, Ratpack y Lagom. En cada caso, he enfatizado la aplicación del cliente mediante un escenario simple de prueba Gatling (100-1000 usuarios / segundo).
He probado ratpack y lagom como servidores io de referencia sin bloqueo para comparar los resultados con el arranque de primavera (bloqueo y no bloqueo).
En todos los casos, tengo los resultados esperados, excepto la prueba Spring Boot 2.0. Funciona solo para niveles de carga pequeños, pero incluso así con alta latencia. Si el nivel de carga aumenta, se agota el tiempo de espera de todas las solicitudes.
Uso de cliente web:
@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)); } }No tengo idea de lo que sale mal o la versión actual de la instantánea solo funciona.
Todas las fuentes publicadas en https://github.com/rutkowskij/blocking-non-blocking-poc
Acabo de crear una aplicación Spring Boot simple usando spring-boot-starter-webflux con la versión 2.0.0.BUILD-SNAPSHOT que trae spring-webflux versión 5.0.0.BUILD-SNAPSHOT y lo mismo para Spring Core, Beans, Context, etc.
El problema ya no existe después del lanzamiento de 5.0 RC4. El problema estaba relacionado con la agrupación de conexiones en reactor-netty y reactor-core.
También probé con Spring Boot 2.0.0.M4: ahora todo se ve bien.
Detalles: http://jira.spring.io/browse/SPR-15584