Mono<List<T>> 与 Spring webflux 中的 Flux<T> 的区别

Mono<List<T>> difference with Flux<T> in Spring webflux

我的理解是Mono<List<T>>是同步的Flux<T> 并且 Flux 无法成为休息 api 响应。

我说的对吗?

如果不是,Mono<List<T>>Flux<T> 有什么区别 或者在某些地方 Flux 可以是休息 api 响应?

  • 作为 return 类型,Mono<List<T>> 意味着您将一次性获得 T 元素的完整列表。
  • Flux<T> 意味着您将获得零到许多 T 个元素,可能会一个接一个地出现。

如果您从 HTTP 客户端获取此类 return 类型,例如 WebClientMono<List<T>>Flux<T> 从运行时的角度来看可能或多或少是等效的,如果 returned Content-Type 例如 "application/json"。在这种情况下,解码器将一次性反序列化响应。唯一不同的是,Flux<T> 提供了更多有趣的运算符,您可以随时 collectList 并退回到 Mono<List>.

另一方面,如果 returned Content-Type 是流媒体,例如 "application/stream+json" 那么这肯定会产生影响,因为您将通过他们来了。事实上,如果 returned 流是无限的,选择 Flux<T> 非常重要,因为另一个永远不会完成。

  • Mono<List<T>> 将发出零个或最大一个 T 类型的项目列表。
  • Flux<T>将发出零个或多个 T
  • 类型的项目

Momo 环绕是有界的,Flux 不是。

Mono<List<T>> is a synchronized Flux

Mono 和 Flux 都是 Reactor implementation of a Publisher interface specified in a Reactive Stream Specification

Reactor Mono class: public abstract class Mono<T> implements Publisher<T> {...}

Reactor Mono class: public abstract class Flux<T> implements Publisher<T> {...}

Flux could not be a rest api response. Of course Fluxcan be used as response type of REST API. By using Flux as return type you can easily switch from asynchronous to synchronous processing . If you use Spring Boot you can even stream data to your consumer just by changing the Content-Type of you API endpoint to application/stream+json as mention by @Brian.

请注意,Flux 和 Mono 是非阻塞的,这意味着您可以更有效地使用工作线程(计算机资源)。