首页 > 解决方案 > 我应该使用同步 Mono::map 还是异步 Mono::flatMap?

问题描述

projectReactor 文档说这Mono::flatMap异步的,如下所示。

所以,我可以编写我所有的方法来返回这样的 Mono 发布者。

public Mono<String> myMethod(String name) {
    return Mono.just("hello " + name);
}

Mono::flatMap像这样使用它:

Mono.just("name").flatMap(this::myMethod);

这会使我的方法的执行异步吗?这是否使我的代码比仅使用 Mono::map更具反应性、更好和更快?对我的所有方法执行此操作的开销是否令人望而却步?

public final Mono flatMap(Function<? super T,? extends Mono<? extends R>> 转换器)

异步转换此 Mono 发出的项,返回另一个 Mono 发出的值(可能更改值类型)。

在此处输入图像描述

标签: spring-webfluxproject-reactor

解决方案


这会使我的方法的执行异步吗?

让我们看看这个的定义Asynchronous

异步编程是一种并行编程方式,其中一个工作单元与主应用程序线程分开运行,并通知调用线程其完成、失败或进度。

在这里,您的工作单元发生在同一个线程中,除非您subscribeOn使用Scheduler. 所以这不是异步的。

这是否使我的代码比仅使用 Mono::map 更具反应性、更好和更快?

没门。由于在这种情况下,发布Mono.just("hello " + name)者会立即通知订阅者我已完成,因此正在进行处理的线程会立即从事件循环中获取该事件并开始处理响应。

相反,这可能会导致内部操作比map简单地转换元素的操作要少。

因此,理想情况下,当您有 I/O 操作(如 DB 调用)或网络调用时,您应该使用 aflatMap,这可能需要一些时间,如果所有线程都忙,您可以利用这些时间来执行其他任务。


推荐阅读