【问题标题】:Mono vs Flux in Reactive Stream响应式流中的 Mono vs Flux
【发布时间】:2018-06-07 21:03:36
【问题描述】:

根据文档:

Flux 是一个可以发出 0..N 个元素的流:

Flux<String> fl = Flux.just("a", "b", "c");

Mono 是 0..1 个元素的流:

Mono<String> mn = Mono.just("hello");

因为两者都是反应流中 Publisher 接口的实现。

我们不能在大多数情况下只使用 Flux,因为它也可以发出 0..1,从而满足 Mono 的条件吗?

或者有一些特定情况只需要使用 Mono 而 Flux 无法处理这些操作? 请建议。

【问题讨论】:

    标签: reactive-programming project-reactor reactive-streams


    【解决方案1】:

    在许多情况下,您正在执行一些计算或调用服务,并且您期望只得到一个结果(或者可能是零个或一个结果),而不是可能包含多个结果的集合。在这种情况下,使用Mono 会更方便。

    将其与“常规”Java 进行比较:您不会使用List 作为任何可以返回零或一个结果的方法的返回类型。您可以改用Optional,这立即表明您不希望得到多个结果。

    【讨论】:

      【解决方案2】:

      Flux 相当于 RxJava Observable 能够发射
      - 零个或多个项目(许多元素的流)
      - 然后 OPTIONALLY ,完成 OR 失败

      Mono最多只能发出一项(流一个元素)

      关系:

      • 如果你连接两个 Mono,你会得到一个 Flux
      • 您可以在 Flux 上调用 single() 以返回 Mono

      【讨论】:

        【解决方案3】:

        来自文档here

        这种区别在类型中携带了一些语义信息,表明异步处理的粗略基数。例如,一个 HTTP 请求只产生一个响应,因此进行计数操作没有多大意义。因此,将这种 HTTP 调用的结果表示为 Mono 比将其表示为 Flux 更有意义,因为它仅提供与零项或一项的上下文相关的运算符。

        【讨论】:

          【解决方案4】:

          就像 Mono 用于处理零个或一个结果,而 Flux 用于处理零到多个结果,甚至可能是无限结果。 两者的共同点都是纯异步且完全非阻塞。

          【讨论】:

            【解决方案5】:

            我认为在我们知道只能得到一个结果的情况下使用 Mono 是一种很好的做法。通过这种方式,我们让其他从事相同工作的开发人员知道结果可以是 0 或 1。

            我们在所有项目中都遵循这种方法。

            这里有一篇关于 Reactive Streams 以及 Mono 和 Flux 使用的好教程 -> Reactive programming in Java.

            【讨论】:

              猜你喜欢
              • 2020-03-17
              • 2018-01-20
              • 2018-05-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-09
              • 2019-10-22
              • 2021-12-30
              相关资源
              最近更新 更多