2017-04-07 8 views
1

차단 작업 (네트워크 호출, 응답 대기 필요)이 포함 된 Project Reactor 체인이 있습니다. 여러 차단 작업을 동시에 실행하고 싶습니다.Blocking I/O 작업을위한 ParallelFlux 대 flatMap()

그것은, 베어 뼈 예 사용될 수) ParallelFlux 또는 flatMap (하나처럼 보인다

:

Flux.just(1) 
    .repeat(10) 
    .parallel(3) 
    .runOn(Schedulers.elastic()) 
    .doOnNext(i -> blockingTask()) 
    .sequential() 
    .subscribe() 

또는 두 가지 기술의 장점은 무엇

Flux.just(1) 
    .repeat(10) 
    .flatMap(i -> Mono.fromCallable(() -> {blockingTask(); return i;}).subscribeOn(Schedulers.elastic()), 3) 
    .subscribe(); 

를? 하나는 다른 것보다 선호됩니까? 대안이 있습니까?

답변

4

parallel는 당신이 runOn에 전달하는 Scheduler에서 자신의 실행 컨텍스트를 얻을 각각의 "레일"또는 "그룹"사이의 성능을 위해 작업의 병렬 처리, 작업의 파견에 맞게 조정됩니다. 즉, CPU 집약적 인 작업을 수행하면 모든 CPU 코어가 작동합니다. 하지만 당신은 I/O 바인딩 작업을하고 있습니다 ...

따라서 귀하의 경우에는 flatMap이 더 좋습니다. 병렬화에 flatMap을 사용하면 오케스트레이션에 대한 자세한 내용을 알 수 있습니다.

flatMap의 약간 다른 맛을 계산하지 않으면 flatMapSequential이 (concatMap은 실제로 병렬 처리를 허용하지 않습니다.)이 두 가지 대안이 있습니다.