flatMap & concatMap & flatMapSequential

박재현·2022년 2월 7일
0

reactive하게 살자

목록 보기
1/2

1. flatMap

public final <R> Flux<R> flatMap(Function<? super T,? extends Publisher<? extends R>> mapper)

flatMap은 방출되는 요소들의 순서를 보장하지 않는다.

flatMap은 Publisher의 up-stream(Publisher) 내부의 Element마다 각각의 inner publisher를 생성하여, 여러개의 하위 stream을 제공하고 이를 subscribe해서 병합한 Flux를 반환한다. up-stream 의 각 element마다 생성된 inner publisher는 각각의 lifecycle를 가지고, 결과 Flux는 eager Loading 되어 수집된다. 따라서 반환되는 Flux에서는 순서를 보장받을 수 없다.

2. concatMap

public final <V> Flux<V> concatMap(Function<? super T,? extends Publisher<? extends V>> mapper)

concatMap은 방출되는 요소들의 순서를 보장하지만, 동시성은 보장하지 않는다

concatMap은 flatMap과 동일한 형태로 up-stream(Publisher)의 각 요소 별 inner publisher와 lifecycle을 가지고 있지만 순서대로 linked된 형태의 consuming을 하기 때문에, 이전 요소의 inner publisher를 수집할 때 까지 대기한다. 즉 각각의 inner-publisher가 순차적으로 consuming 하는것을 기다리고 up-stream의 마지막 요소가 방출될 때 결과 Flux를 반환한다.

3. flatMapSequential

public final <R> Flux<R> flatMapSequential(Function<? super T,? extends Publisher<? extends R>> mapper)

flatMapSequential 방출되는 요소들의 순서와 동시성을 보장한다

flatMapSequential은 concatMap과 결과는 같지만, 내부 동작이 다르다.
up-stream(Publisher)의 각 요소별 inner publisher와 lifecycle을 가지고 있으나 이전 요소의 inner publisher를 수집할 때 까지 대기하지 않고 즉시 로딩한다. 이렇게 이야기하면 concatMap과 차이가 없게 느껴질 수 있을 수 있다

하지만 flatMapSequential은 concatMap과 다르게 inner-publisher를 consume 하는것을 기다리지 않고 동시다발적으로 inner-publisher를 우선 consume하고 up-stream에서 위치했던 순서에 따라 다운스트림에 병합될지, 큐잉 할지 결정한다.
즉 up-stream에서 앞에 위치했던 element의 inner-publisher가 다운 스트림에 아직 방출이 되지 않은 상태라면 큐잉되어 대기한다. 따라서 inner-publisher마다 동기적으로 방출을 기다리는것이 아니라 비동기적으로 consume한 이후 큐잉을 통해 결과 다운 스트림을 정렬된 상태로 내보내는것을 보장하기 때문에 내부적인 pub-sub에서는 각 inner-publish의 task 동시성이 보장된다.

0개의 댓글