优秀的编程知识分享平台

网站首页 > 技术文章 正文

Webflux和@Async性能对比(webflux client)

nanyue 2024-08-20 17:33:15 技术文章 5 ℃

如果你正在用 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 框架中的一个特性。

Tags:

最近发表
标签列表