Web反应式编程-从HTTP客户端的角度来看,优点是什么?

相互依赖

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

1)响应式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 MVC具有DeferredResult

@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 react让我们认为它正在将结果发送回生产过程中,但实际上并不会那样发生,并且除非所有数字都已包含,否则客户将无法处理结果已生成。

使客户端完全反应的直接方法是使用WebSockets。

因此,除了很酷的东西(例如不错的语义,组合...)之外,考虑到浏览器的HTTP请求不是被动的,并且等同于使用传统的DeferredResult,使用Spring Web Reactive有什么意义?

罗森·斯托扬切夫(Rossen Stoyanchev)

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

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

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

这更多是关于如何流式传输到浏览器的问题?例如,如果添加"Accept: text/event-stream"为请求标头,则可以在浏览器中将每个double用作一个单独的事件。因此,服务器具有执行和高效执行功能的能力。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章