当前位置: 首页 > 知识库问答 >
问题:

Web反应式编程——从HTTP客户端的角度来看,有哪些优势?

饶骁
2023-03-14

让我们假设以下两种情况,一个控制器产生一些随机数并带有延迟:

1)反应性Spring5反应性应用:

@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 Responsive让我们认为它在生成结果时会将结果发送回去,但实际上情况并非如此,在生成所有数字之前,客户端将无法处理结果。

让客户端完全反应的简单方法是使用WebSocket。

所以,除了一些很酷的东西(比如漂亮的语义、构图…),考虑到浏览器HTTP请求不是被动响应的,并且等同于使用传统的延迟结果,使用Spring Web被动响应有什么意义?

共有1个答案

魏君博
2023-03-14

有差异,所以让我试着把它分解。

对于DeferredResult

Spring Web Reactive会从流量中写入每个单独的值

这更像是一个如何将数据流传输到浏览器的问题?例如,如果添加“Accept:text/event stream”作为请求头,则可以在浏览器中将每个double作为单个事件使用。因此,服务器能够做到这一点,并有效地做到这一点。

 类似资料:
  • 我试图测试Spring反应式Webclient的默认超时。为此,我创建了一个需要 10 小时才能返回响应的 rest endpoint。 我使用spring-reactive Webclient创建了一个rest客户端。但我看到,springReactiveWebclient一直在等待10个小时。 spring reactive Webclient没有任何默认超时吗?

  • 我试图使用Spring反应式WebClient将文件上传到Spring控制器。控制器非常简单,看起来像这样: 当我使用这个控制器与cURL一切正常 multipartFile转到正确的参数,其他参数进入Map。 当我尝试从WebClient做同样的事情时,我被卡住了。我的代码如下所示: 这会导致400错误 有人知道如何解决这个问题吗?

  • 本文向大家介绍WEB应用从服务器主动推送Data到客户端有哪些方 式?相关面试题,主要包含被问及WEB应用从服务器主动推送Data到客户端有哪些方 式?时的应答技巧和注意事项,需要的朋友参考一下 一般的服务器Push技术包括: 基于AJAX的长轮询(long一polling)方式,服务器Hold—段时间后再返回信息; HTTP Streaming,通过iframe和〈script〉#签完成数据的传

  • 如何将响应从反应型HTTP客户机流式传输到控制器,而不在任何时候将整个响应主体放在应用程序内存中? 几乎所有project reactor客户机的示例都返回。据我所知,反应流是关于流,而不是加载它,然后发送响应。 是否可以返回,以便在不需要使用大量RAM内存来存储中间结果的情况下,将大文件从某个外部服务传输到应用程序客户机?

  • 例如,在本文中,我试图理解为什么在流中使用flatmap()(直接从引用中粘贴副本) AFAIK,应用于流的平面图会为流中的每个输入值产生任意数量的值(0... n)。所以一个平面图需要一个产生流的函数。 通量发射0个或多个项目,然后可选地完成或偏离。 那么,响应流上到底发生了什么?这是接收响应流并发出0个或更多类警报对象的函数吗?因此,如果我们

  • 创建 HTTP 客户端 使用默认选项创建一个HttpClient实例,如下所示: HttpClient client = vertx.createHttpClient(); 如果您想要在创建时配置客户端的选项,如下所示: HttpClientOptions options = new HttpClientOptions().setKeepAlive(false); HttpClient clien