Project Reactor 中的预取是什么意思?

Cow*_*Zow 6 spring project-reactor

我正在使用 Project Reactor 并且正在使用Flux.flatMapIterable。(我基本上有一个对象 A 的流;对于每个对象 AI 将它平面映射到一个对象 B 的流中,然后我从中创建一个新的通量。)

我试图了解prefetch设置的作用。就我而言,每个对象 A 都可能转换为任意数量的对象 B(0 到 N 之间;N 很大)。

我只想明白:

  • 什么是预取?它是否仅适用于初始请求?(即,如果我将其设置为 1,那么如果 Project Reactor 发现 1 太小,它是否足够智能以增加请求大小?)

  • 这与我这里的情况有关吗?我正在考虑将预取设置为 1 以保持保守,因为单个 A 对象有可能被平面映射到大量的 B 对象流中。

McG*_*Gin 8

预取将影响 Reactor 在其第一个请求中从发布者请求的项目数。它是一个影响后续请求的上限,当发出预取量的 75% 时将触发后续请求,因此不会自动增加。

它通常用于消费者请求大量数据但数据源表现更好或可以使用较小请求进行优化(例如数据库分页等)的场景。

它是否与您的用例相关取决于您的发布者的特征。

来自关于配置背压1的 [文档]

您可能还注意到,某些运算符的变体采用称为 prefetch 的 int 输入参数。这是另一类修改下游请求的操作符。这些通常是处理内部序列的运算符,从每个传入元素(如 flatMap)派生一个发布者。

预取是一种调整对这些内部序列发出的初始请求的方法。如果未指定,这些运算符中的大多数都以 32 的需求开始。

这些算子通常也实施补充优化:一旦算子看到 25% 的预取请求得到满足,它就会从上游重新请求 25%。这是一种启发式优化,以便这些操作员主动预测即将到来的请求。