Я просто тестирую пример PoC-проекта на некоторые блокирующие/неблокирующие решения в простом общем сценарии.
Сценарий:
- Остальная блокировка конечной точки довольно медленная - каждый запрос занимает 200 мс.
- Есть другое - клиентское приложение, которое вызывает эту медленную конечную точку.
Я тестировал текущий (блокирующий) Spring загрузочный клиент (tomcat), Spring Boot 2.0 (netty) с WebFlux - WebClient, Ratpack и Lagom. В каждом случае я подчеркивал клиентское приложение с помощью простого сценария тестирования gatling (100-1000 пользователей в секунду).
Я тестировал ratpack и lagom в качестве эталонных неблокирующих серверов io для сравнения результатов с загрузкой Spring (блокирование и не блокирование).
Во всех случаях у меня есть результаты, как ожидалось, кроме теста 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 Клиент Boot 2.0 и WebClient
Я просто создал простое приложение Spring для загрузки с помощью spring -boot-starter-webflux с версией 2.0.0.BUILD-SNAPSHOT, которая приносит spring -webflux версию 5.0.0.BUILD-SNAPSHOT и то же самое для Spring Ядро, Beans, Контекст и т.д.