Project Reactor中反应流的内存中转换

问题描述 投票:2回答:1

我有以下界面:

interface Checker {
  Mono<Foo> check(Bar bar);
}

另请注意,Bar有一个方法getPizzas()

class Bar {
  List<Pizza> getPizzas() { ... }
}

在某些情况下,实现类通过使用启用了响应的HTTP客户端来使用非阻塞IO操作的好处。

但是,在其他情况下,没有IO操作,所以我只想使用一个方法transform,它接受List<Pizza>并返回一个Foo的实例,并将其作为Mono<Foo>返回。

transform的签名是:

Foo transform(List<Pizza> pizzas) { ... }

根据我的理解,我有两个选项(可能更多)来实现这样的Checker:

选项[1.a] - 尽可能使用反应流方法:

Mono<Foo> check(Bar bar) {
  return Flux.fromIterable(bar.getPizzas()).collectList().map(pizzas -> transform(pizzas));
}

选项[1.b] - 与[1.a]几乎相同:

Mono<Foo> check(Bar bar) {
  return Mono.just(bar.getPizzas()).map(pizzas -> transform(pizzas));
}

选项[2] - 使用纯Java进行内存转换:

Mono<Foo> check(Bar bar) {
  return Mono.just(transform(bar.getPizzas()));
}

我的问题:

上述选项有区别吗?

如果map是CPU密集型并且需要花费大量时间(例如,超过2秒),那么使用反应性transform是否会更好?

java reactive-programming blocking project-reactor in-memory
1个回答
0
投票

除非您对每个Pizza进行转换,否则没有理由使用Flux。此外,您提供的每种方法都将完全相同。如果您担心CPU密集型操作,则应使用Parallel线程池订阅该操作,以卸载工作并释放事件循环线程。

Mono.just(bar.getPizzas())
   .map(pizzas -> transform(pizzas))
   .subscribeOn(Schedulers.parallel())
© www.soinside.com 2019 - 2024. All rights reserved.