使用 Mono<Object>.publishOn(Schedulers.elastic) 进行阻塞操作是不是可以接受?

Posted

技术标签:

【中文标题】使用 Mono<Object>.publishOn(Schedulers.elastic) 进行阻塞操作是不是可以接受?【英文标题】:Is it acceptable to use Mono<Object>.publishOn(Schedulers.elastic) for blocking operations?使用 Mono<Object>.publishOn(Schedulers.elastic) 进行阻塞操作是否可以接受? 【发布时间】:2018-04-19 08:06:40 【问题描述】:

我知道在反应流中使用阻塞操作时,我们应该使用Publisher&lt;Object&gt;.publishOn(Schedulers.elastic).subscribe(//blocking operations go here)

我明白,当我的发布者发布项目列表(例如:Flux)时,未来的项目不必等待当前项目被阻止操作阻止是有意义的。但是如果是Mono,有必要吗?因为我的管道中只会有一件物品流动。

PS。我正在使用类似这样的 spring boot 2 反应通量控制器。

@RestController("/item")
public Mono<Response> saveItem(Mono<Item> item) 
  return
  item.publishOn(Schedulers.elastic()) **//Do I need this ?**
      .map(blockingDB.save(item))
      .map(item -> new Response(Item);


【问题讨论】:

您可能对***.com/questions/46918303/…也感兴趣 【参考方案1】:

是的,绝对!

如果你不这样做,你就会阻塞主处理/事件循环线程。其中,您应该只拥有与您的机器拥有(有效)CPU 一样多的 CPU。

假设是 8。这意味着只有 8 个并发请求正在等待阻塞操作,您的应用程序将完全停止!

此外,请确保在阻塞操作之后将处理移回用于 CPU 密集型工作的线程池。

【讨论】:

以上是关于使用 Mono<Object>.publishOn(Schedulers.elastic) 进行阻塞操作是不是可以接受?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mono<Object>.publishOn(Schedulers.elastic) 进行阻塞操作是不是可以接受?

我可以运行 2 个 Mono 异步 Reactor Core 吗?

Spring 5 新特性:函数式Web框架

反应堆映射 Mono<Boolean> 到 Mono<Void>

在 Mono<String> 中转换 Mono<Void> 添加一个值

Mono<ServerResponse> 与 Mono<ResponseEntity<MyPojo>> 作为 Java Spring Webflux @Reques