Publish subscribe 为什么订户在不同的情况下请求不同数量的元素?

Publish subscribe 为什么订户在不同的情况下请求不同数量的元素?,publish-subscribe,spring-webflux,publisher,reactive-streams,Publish Subscribe,Spring Webflux,Publisher,Reactive Streams,我正在学习反应流和发布subcribe实用程序,并使用Publisher(在我的例子中是Flux)和Subscriber的默认行为 我有两个场景,都有相同数量的元素在变化。但是当我分析日志时,onSubscribe方法请求不同数量的元素(比如在一种情况下请求无界元素,在另一种情况下请求32个元素) 以下是两个案例和日志: System.out.println("*********Calling MapData************"); List<Inte

我正在学习反应流和发布subcribe实用程序,并使用Publisher(在我的例子中是Flux)和Subscriber的默认行为

我有两个场景,都有相同数量的元素在变化。但是当我分析日志时,onSubscribe方法请求不同数量的元素(比如在一种情况下请求无界元素,在另一种情况下请求32个元素)

以下是两个案例和日志:

        System.out.println("*********Calling MapData************");
        List<Integer> elements = new ArrayList<>();
        Flux.just(1, 2, 3, 4)
          .log()
          .map(i -> i * 2)
          .subscribe(elements::add);
        //printElements(elements);
        System.out.println("-------------------------------------");

        System.out.println("Inside Combine Streams");
        List<Integer> elems = new ArrayList<>();
        Flux.just(10,20,30,40)
            .log()
            .map(x -> x * 2)
            .zipWith(Flux.range(0, Integer.MAX_VALUE),
                (two, one) -> String.format("First  : %d, Second : %d \n", one, two))
            .subscribe(new Consumer<String>() {
              @Override
              public void accept(String s) {

              }
            });
        System.out.println("-------------------------------------");
*********Calling MapData************
[warn] LoggerFactory has not been explicitly initialized. Default system-logger will be used. Please invoke StaticLoggerBinder#setLog(org.apache.maven.plugin.logging.Log) with Mojo's Log instance at the early start of your Mojo
[info] | onSubscribe([Synchronous Fuseable] FluxArray.ArraySubscription)
[info] | request(unbounded)
[info] | onNext(1)
[info] | onNext(2)
[info] | onNext(3)
[info] | onNext(4)
[info] | onComplete()
-------------------------------------
Inside Combine Streams
[info] | onSubscribe([Synchronous Fuseable] FluxArray.ArraySubscription)
[info] | request(32)
[info] | onNext(10)
[info] | onNext(20)
[info] | onNext(30)
[info] | onNext(40)
[info] | onComplete()
[info] | cancel()
-------------------------------------
既然我没有使用任何定制订户实现,那么为什么在“MapData”案例中,它记录的是“[info]|请求(无界)”,而在“Inside Combine Streams”案例中,它记录的是“[info]|请求(32)”


请提出建议。

首先,您应该知道这是预期的行为

根据您使用的操作员,反应堆将应用不同的预取策略:

  • 某些运算符将使用默认值,如
    32
    256
  • 如果添加了具有特定值的缓冲运算符,某些安排将使用您提供的值
  • Reactor可以猜测值流是有限的,并将请求一个无界值
如果将运算符变量与
int prefetch
方法参数一起使用,或者使用
BaseSubscriber
实现自己的
Subscriber
(提供了几种有用的方法),则始终可以更改此行为

底线是,你通常不需要注意这个特定的价值;它只有在您想要为特定数据源优化预取策略时才有用