Spring/Webflux

Scheduler

blockbuddy93 2024. 2. 29. 18:46

 

Scheduler를 위한 전용 Operator

  • publishOn() : Operator 체인에서 Downstream Operator의 실행을 위한 쓰레드를 지정한다.
  • subscribeOn() : 최상위 Upstream Publisher의 실행을 위한 쓰레드를 지정한다. 즉 원본 데이터 소스를 emit하기 위한 스케줄러를 지정한다.
  • paraller(): Downstream 에 대한 데이터 처리를 병렬로 분할 처리하기 위한 쓰레드를 지정한다.

 

ParallelFlux의 동작 방식

    Flux.fromArray(new Integer[]{1, 3, 5, 7, 9, 11, 13, 15})
      .parallel()
      .subscribe(Logger::onNext);

    Flux.fromArray(new Integer[]{1, 3, 5, 7, 9, 11, 13, 15})
      .parallel()
      .runOn(Schedulers.parallel())
      .subscribe(Logger::onNext);

    // 8개 -> 10개 데이터
    Flux.fromArray(new Integer[]{1, 3, 5, 7, 9, 11, 13, 15, 17, 19})
      .parallel()
      .runOn(Schedulers.parallel())
      .subscribe(Logger::onNext);

    Flux.fromArray(new Integer[]{1, 3, 5, 7, 9, 11, 13, 15, 17, 19})
      .parallel(4)
      .runOn(Schedulers.parallel())
      .subscribe(Logger::onNext);

 

 

publishOn()과 subscribeOn() 동작 이해 1

Operator 체인에서 최초 쓰레드는 subscribe()가 호출되는 scope에 있는 쓰레드이다.

 

pulishOn()과 subscribeOn() 동작 이해 2

Operator 체인에서 publishOn()이 호출되면 publishOn() 호출 이후의 Operator 체인은 다음 publishOn()을 만나기전까지 publishOn()에서 지정한 Tread에서 실행이 된다.

 

pulishOn()과 subscribeOn() 동작 이해 3

Operator 체인에서 publishOn()이 호출되면 publishOn() 호출 이후의 Operator 체인은 다음 publishOn()을 만나기전까지 publishOn()에서 지정한 Tread에서 실행이 된다.

 

pulishOn()과 subscribeOn() 동작 이해 4

subscribeOn() 은 최상위 Upstream Publisher의 실행 쓰레드를 subscribe() 호출 scope의 쓰레드에서 subscribeOn()에서 지정한 쓰레드로 바꾼다.

 

 

pulishOn()과 subscribeOn() 동작 이해 5

subscribeOn()과 publishOn()이 같이 있다면, publishOn()을 만나기 전 까지의 Upstream Operator 체인은 subscribeOn()에서 지정한 쓰레드에서 실행되고, publishOn()을 만날때 마다 publishOn() 아래의 Operator 체인 downstream은 publishOn()에서 지정한 쓰레드에서 실행된다.

 

pulishOn()과 subscribeOn() 동작 이해 6

subscribeOn()이 publishOn()이 뒤에 위치하든 상관없이 publishOn()을 만나기 전 까지의 Upstream Operator 체인은 subscribeOn()에서 지정한 쓰레드에서 실행된다.