使用 Mono<Object>.publishOn(Schedulers.elastic) 进行阻塞操作是否可以接受?
Is it acceptable to use Mono<Object>.publishOn(Schedulers.elastic) for blocking operations?
我理解在反应流中使用阻塞操作时我们应该使用 Publisher<Object>.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);
}
是的,绝对!
如果你不这样做,你就会阻塞主 processing/event 循环线程。其中,您应该只拥有您的机器拥有的(有效)CPU 个数量。
假设是 8。这意味着只有 8 个并发请求正在等待阻塞操作,您的应用程序将完全停止!
此外,确保在阻塞操作后将处理移回线程池以用于 CPU 紧张的工作。
我理解在反应流中使用阻塞操作时我们应该使用 Publisher<Object>.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);
}
是的,绝对!
如果你不这样做,你就会阻塞主 processing/event 循环线程。其中,您应该只拥有您的机器拥有的(有效)CPU 个数量。
假设是 8。这意味着只有 8 个并发请求正在等待阻塞操作,您的应用程序将完全停止!
此外,确保在阻塞操作后将处理移回线程池以用于 CPU 紧张的工作。