如果你正在用 Java 构建有多种异步处理的 Web 应用程序,那么你可以考虑使用两种方式。
一种方法是在 Spring 中使用 @Async 注解,这种方式是将长时间运行的任务委托给单独的线程。另一种方法是使用 Spring WebFlux,WebFlux 提供了一种非阻塞、事件驱动的编程模型来构建响应式 Web 应用程序。
接下来,我们将测试一下 Spring WebFlux 和 @Async 性能差异,如下:https://******.com/geo 是相对耗时的外部请求。
Webflux
@RestController
public class ExternalAPIController {
private final WebClient webClient;
public ExternalAPIController(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://******.com").build();
}
@GetMapping(value = "/data", produces = MediaType.APPLICATION_JSON_VALUE)
public Mono<String> getData() {
return webClient.get()
.uri("/geo")
.retrieve()
.bodyToMono(String.class);
}
}
@Async
public class ExternalCall {
private final RestTemplate restTemplate;
public ExternalCall(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping(value = "/data", produces = MediaType.APPLICATION_JSON_VALUE)
public CompletableFuture<String> getData() {
return getDataAsync();
}
@Async
public CompletableFuture<String> getDataAsync() {
String result = restTemplate.getForObject("https://ipinfo.io/161.185.160.93/geo", String.class);
return CompletableFuture.completedFuture(result);
}
}
使用 JMeter 进行压测:
JMeter 中 Webflux 的平均值 (4021) 和最大值 (8090) ,@Async 平均值(6684)和最大值(11542),可以看出 Webflux 的性能要优于 @Async 。
总结
WebFlux 和 @Async 是两种不同的技术,都可以用于异步处理。
WebFlux 是一个基于 Reactor 库的非阻塞式编程框架,用于构建响应式应用程序。它支持响应式编程和流式数据处理,并使用异步非阻塞式 I/O 来提高应用程序的性能和吞吐量。WebFlux 可以处理大量的并发请求,适用于高负载的 Web 应用程序。
@Async 是 Spring 框架提供的一种异步处理方式,它可以将一个方法标记为异步方法,Spring 会自动将该方法调用放入一个线程池中执行,从而实现异步执行。它可以用于在后台处理一些非阻塞的任务,例如发送邮件、处理图片等。
相比较而言,WebFlux 更适合处理高并发、高吞吐量的 Web 应用程序,而 @Async 更适合在后台执行一些非阻塞的任务。此外,WebFlux 是一个完整的响应式编程框架,而 @Async 只是 Spring 框架中的一个特性。