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

时间:2019-06-19 20:38:36

标签: spring project-reactor

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

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

我只想了解:

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

  • 这与我在这里的情况有关吗?我一直在考虑将prefetch设置为1,以便比较保守,因为单个A对象有可能被映射到大量B对象流中。

1 个答案:

答案 0 :(得分:2)

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

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

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

从[文档]中配置背压1

  

您可能还已经注意到,某些运算符的变体   接受一个称为预取的int输入参数。这是另一个类别   修改下游请求的运营商。这些通常是   处理内部序列的运算符,派生自   每个传入的元素(如flatMap)。

     

Prefetch是一种调整对这些内部请求的初始请求的方法   序列。如果未指定,则大多数这些运营商会以需求开始   之32。

     

这些运算符通常还会实现补充优化:   一旦操作员看到25%的预取请求已满足,它就会   从上游重新请求25%。这是一个启发式优化   以便这些运营商主动预测即将到来的请求。