gpt4 book ai didi

spring - Web 响应式(Reactive)编程 - 从 HTTP 客户端的角度来看有什么优势?

转载 作者:IT老高 更新时间:2023-10-28 13:55:01 28 4
gpt4 key购买 nike

让我们假设 Controller 会延迟生成一些随机数的这两种情况:

1) 响应式(Reactive) Spring 5 响应式(Reactive)应用程序:

@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) 带有DeferredResult的传统Spring MVC:

@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 让我们认为它在生成结果时将其发回,但实际上它不会以这种方式发生,并且客户端将无法处理结果,直到所有数字已生成。

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

所以,除了很酷的东西(例如漂亮的语义、组合...)之外,考虑到浏览器 HTTP 请求不是响应式的并且等效于使用传统的DeferredResult?

最佳答案

存在差异,所以让我试着分解一下。

对于 DeferredResult<Double[]>显然,在将值写入响应之前,必须先准备好数组。

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

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

关于spring - Web 响应式(Reactive)编程 - 从 HTTP 客户端的角度来看有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38761203/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com