【问题标题】:Should I use synchronous Mono::map or asycnhronous Mono::flatMap?我应该使用同步 Mono::map 还是异步 Mono::flatMap?
【发布时间】:2020-11-19 15:14:09
【问题描述】:

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 发出的值(可能更改值类型)。

【问题讨论】:

  • @AbhinabaChakraborty 你仍然部分正确。
  • @ConcurrentBhai 我可能是。你能指出我哪里错了,以便我改进

标签: spring-webflux project-reactor


【解决方案1】:

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

我们来看看Asynchronous的定义:

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

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

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

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

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

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

【讨论】:

  • 我不会说在异步编程的情况下,工作是在完全分离的线程上完成的。相反,它是非阻塞的,可以为工作“借用”或“共享”同一个线程。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多