Web 响应式编程 - 从 HTTP 客户端的角度来看有哪些优点?

2024-02-15

让我们假设控制器生成一些带有延迟的随机数的这两种情况:

1)Reactive Spring 5响应式应用:

@GetMapping("/randomNumbers")
public Flux<Double> getReactiveRandomNumbers() {
    return generateRandomNumbers(10, 500);
}

/**
 * Non-blocking randon number generator
 * @param amount - # of numbers to generate
 * @param delay - delay between each number generation in milliseconds
 * @return
 */
public Flux<Double> generateRandomNumbers(int amount, int delay){
    return Flux.range(1, amount)
               .delayMillis(delay)
               .map(i -> Math.random());
}

2)传统的Spring MVCDeferredResult:

@GetMapping("/randomNumbers")
public DeferredResult<Double[]> getReactiveRandomNumbers() {
    DeferredResult<Double[]> dr = new DeferredResult<Double[]>();

    CompletableFuture.supplyAsync(() -> {
        return generateRandomNumbers(10, 500);
    }).whenCompleteAsync((p1, p2) -> {
        dr.setResult(p1);
    });

    return dr;
}

/**
 * Blocking randon number generator
 * @param amount - # of numbers to generate
 * @param delay - delay between each number generation in milliseconds
 * @return
 */
public Double[] generateRandomNumbers(int amount, int delay){
    int generated = 0;
    Double [] d = new Double[amount];
    while(generated < amount){
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {}
        d[generated] = Math.random();
        generated++;
    }
    return d;
}

从 HTTP 客户端(浏览器、AJAX 请求)的角度来看,这两种情况没有任何区别。我的意思是客户端将等到所有结果发送完毕,并且在提交整个响应之前不会处理它们。

也就是说,虽然 Spring Web Reactive 让我们认为它在生成结果时将结果发送回来,但实际上情况并非如此,并且客户端将无法处理结果,直到所有数字都完成为止。已生成。

让客户端完全响应的直接方法是使用 WebSocket。

所以,除了很酷的东西(比如好的语义、构图……),考虑到浏览器 HTTP 请求不是响应式的并且等同于使用传统的 DeferredResult,使用 Spring Web Reactive 的意义何在?


存在差异,所以让我尝试将其分解。

For the DeferredResult<Double[]>返回值 显然,必须先准备好数组,然后才能将值写入响应。

Spring Web Reactive 确实从 a 中写入每个单独的值Flux<Double>当它变得可用时。现在,从浏览器的角度来看,您可能看不到实际的差异,因为在完整接收之前它不会为您提供完整的 JSON 数组。

这更多的是如何流式传输到浏览器的问题?例如,如果您添加"Accept: text/event-stream"作为请求标头,您可以将每个双精度作为浏览器中的单独事件使用。所以服务器有能力做到这一点并且高效地做到这一点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web 响应式编程 - 从 HTTP 客户端的角度来看有哪些优点? 的相关文章

随机推荐