【问题标题】:Correct way to do multiple calls to same service API using Spring Reactive WebClient?使用 Spring Reactive WebClient 对同一服务 API 进行多次调用的正确方法?
【发布时间】:2020-10-30 12:01:10
【问题描述】:

对同一个服务 API 进行多次调用的正确方法是什么?下面的代码是我试图实现的。

Flux.fromIterable(userIds)
    .parallel()
    .runOn(Schedulers.elastic())
    .flatMap(this::getUser)

【问题讨论】:

  • 我相信只使用平面地图
  • 是的。我在多个地方读到过它,并且明白 flatmap 就足够了。但是你能解释一下我可以使用parallelFlux的用例吗?使用它而不是仅仅使用flatmap运算符有什么缺点。 @ThomasAndolf

标签: spring mono spring-webflux flux reactive


【解决方案1】:

这是我阅读文档后的理解,但我很可能是错的,在这种情况下,投反对票,我会删除这个答案。

关于parallel的文档:

以循环方式在与 CPU 内核数量匹配的多个“轨道”上划分数据。

Flux#parallel 将返回一个 ParallelFlux,它将分配一些所谓的 rails 上的任何工作,以循环方式将工作负载分配给内核数量电脑有。 保证您的工作被放置在多个计算机内核上。

关于平面图的文档:

将这个 Flux 发出的元素异步转化为 Publishers,然后通过合并将这些内部的发布者扁平化为一个 Flux,让它们可以交错。

虽然flatMap(这里我可能错了)只是通过将所有项目放在单独的Mono<T> 中来使工作异步,并且指定的线程将在工作负载之间切换以尝试执行工作负载并解决Mono<T> s 尽可能快地使用已定义调度程序中的指定线程。 这里似乎无法保证会使用多个内核。

这是我阅读文档的理解。

Parallelizing Work with ParallelFlux

Flux#parallel

Flux#FlatMap

我个人的看法是,为每个请求指定自己的核心可能是矫枉过正,可能需要一些设置时间来将作业分配给核心等。

我只会将并行用于 CPU 密集型工作,而常规 flatMap 将适用于 blocking 任务,在这些任务中线程可以在等待响应时轻松切换到其他工作。

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 2018-06-11
    • 2020-03-22
    • 2021-08-19
    • 2014-08-28
    • 2018-10-16
    • 2018-08-12
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多