인프런 커뮤니티 질문&답변

denia park님의 프로필 이미지

작성한 질문수

Kevin의 알기 쉬운 Spring Reactive Web Applications: Reactor 1부

Scheduler의 종류

[Scheduler의 종류 강의] Schedulers.newParallel 메서드에 관한 질문

해결된 질문

작성

·

44

0

안녕하세요 강사님

 

Scheduler의 종류 강의를 수강하고 공부를 하던 와중에 newParallel 메서드에 대해서 궁금증이 생겨서 질문을 하게 됐습니다.

 

예제 코드에서는 newParallelparallelism변수 값을 4를 주셨는데 저는 3을 줘서 테스트를 해봤습니다.

 

해당 코드로 실행을 하면, 다음과 같은 로그가 나오게 됩니다.

public class SchedulersNewParallelExample01 {
    public static void main(String[] args) {
       Mono<Integer> flux =
          Mono
             .just(1)
             .publishOn(Schedulers.newParallel("Parallel Thread", 3, true));

       //쓰레드 할당
       flux.subscribe(data -> {
          TimeUtils.sleep(5000L);
          Logger.onNext("subscribe 1", data);
       });

       //쓰레드 할당
       flux.subscribe(data -> {
          TimeUtils.sleep(4000L);
          Logger.onNext("subscribe 2", data);
       });

       //쓰레드 할당
       flux.subscribe(data -> {
          TimeUtils.sleep(3000L);
          Logger.onNext("subscribe 3", data);
       });

       //쓰레드 할당
       flux.subscribe(data -> {
          TimeUtils.sleep(2000L);
          Logger.onNext("subscribe 4", data);
       });

       TimeUtils.sleep(8000L);
    }
}

 

16:18:03.554 [Parallel Thread-3] INFO com.example.springwebflux.util.Logger -- # subscribe 3 onNext(): 1
16:18:04.548 [Parallel Thread-2] INFO com.example.springwebflux.util.Logger -- # subscribe 2 onNext(): 1
16:18:05.560 [Parallel Thread-1] INFO com.example.springwebflux.util.Logger -- # subscribe 1 onNext(): 1
16:18:07.561 [Parallel Thread-1] INFO com.example.springwebflux.util.Logger -- # subscribe 4 onNext(): 1

제가 여기서 여쭤보고 싶은 사항은 다음과 같습니다.

  1. Round-Robin 방식을 통해서 각 쓰레드에 작업을 분배하고 더 많은 작업이 들어오면 각 쓰레드의 큐에 작업을 적재하는 것처럼 보이는데요.

    작업들을 효율적으로 처리하기 위해서는 먼저 작업이 끝난 Parallel Thread-3에서 남아있는 작업을 가져가서 처리를 하면 좋을 것 같은데 [워크 스틸링(Work Stealing) 같은 처리]

    Spring WebFlux에서는 해당 기능은 지원하지 않는 것인지 궁금합니다.

감사합니다

답변 2

1

Kevin님의 프로필 이미지
Kevin
지식공유자

안녕하세요.

Spring WebFlux에서 work-stealing 같은 처리를 지원하는지 질문 주셨는데요.

제가 알기로는 아래와 같이 ParallelFlux가 work-stealing 기능을 지원은 하는걸로 알고 있습니다.

K-025.png

 

다만, 작업을 가져가서 처리하는 work-stealing이라는 일반적인 의미와는 조금 다른 의미라고 생각해요.

 

리액티브 프로그래밍에서는 들어오는 데이터 즉, 데이터 스트림을 처리할 때 라운드 로빈 방식으로 데이터를 처리하는데 처리할 데이터를 미리 fetch(prefetch)해서 작업 효율성을 높일 수 있는데요.

이 prefetch하는 데이터의 양을 내부적으로 동적으로 조절해서 처리하는걸로 알고 있습니다.

한마디로 다른 쓰레드보다 들어오는 데이터를 더 빨리 처리하는 쓰레드는 데이터를 조금 더 많이 prefetch 해서 처리한다고 생각하시면 될 것 같습니다.

 

Spring WebFlux에서 이런 기능을 지원한다기 보다는 Reactor 같은 리액티브 프로그래밍 라이브러리에서 지원한다고 보시면 될 것 같아요.

0

안녕하세요, 인프런 AI 인턴입니다. denia park님.

Spring WebFlux에서 newParallel 메서드에 대한 궁금점이 있으시군요. 해당 메서드는 Schedulers 클래스의 일부로, 병렬 처리를 위한 새로운 스케줄러를 생성하는 데 사용됩니다. 입력한 parallelism 숫자에 따라 특정 개수의 쓰레드가 생성되고 작업이 라운드 로빈 방식으로 분배됩니다.

질문에 대한 답변

  1. 워크 스틸링(Work Stealing) 지원 여부: Spring WebFlux에서 사용되는 Project Reactor는 기본적으로 라운드 로빈 방식으로 작업을 할당합니다. 워크 스틸링을 직접 지원하는 기능은 제공되지 않지만, 필요하다면 직접 구현하거나 사용 사례에 따라 다른 스케줄러를 사용하여 간접적으로 해결할 수 있습니다.

추가적으로 도움이 될 만한 기존 답변 링크:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.