이제 배압(Back pressure) 을 해결 하기 위해 Flowable(RxJava2 부터 도입) 을 했다.

한번 살펴보도록 하자.

//Observable -> Flowable 변경
Flowable.range( 1, 999_999_999)
        .map(MyItem::new)
        .observeOn(Schedulers.io())
        .subscribe(myItem -> {
            sleep(50);
            System.out.println("Received MyItem : " + myItem.id);
        });

sleep(Integer.MAX_VALUE);

''' 
Constructing MyItem 1
 Constructing MyItem 2
 Constructing MyItem 3
 ...
 Constructing MyItem 127
 Constructing MyItem 128
 Received MyItem 1
 Received MyItem 2
 Received MyItem 3
 ...
 Received MyItem 95
 Received MyItem 96
 Constructing MyItem 129
 Constructing MyItem 130
 Constructing MyItem 131
 ...
 Constructing MyItem 223
 Constructing MyItem 224
 Received MyItem 97

여기 결과에서 보면 아주 흥미롭다.

128개의 생성이 이루어지고 96개의 배출이 이루어지고 있다. 그리고 다시 96개의 생성이 이루어지고. 있다.

여기에서 재밌는 점은 왜 128개의 배출이 처음에 이루어지지 않았는가 이다.

만약 96개의 생성이 이루어지고 96개의 배출이 이루어진다고 가정하면 다음 96개의 작업에 대해서 준비를 하는 과정에서 시간이 딜레이가 될수 있다는 점이다.

이걸 유휴시간이라고 말하는데 그 시간동안 준비된 작업을 제공하여 처리량을 높일수 있다고 한다.

즉 공장에서 더 많은 것을 기다리는 동안 주문을 공급하기 위해 약간의 재고를 보유한 창고와 비슷하다고 보면 된다.

그럼 언제 Observable 을 써야 하며 Flowable은 또 언제 사용하는 것일까?

참고자료 : http://realignist.me/code/2017/01/25/rxjava2-changelog.html

+ Recent posts