RxJava는 반응형 프로그래밍을 위한 자바 라이브러리로, 이벤트 스트림을 다루기 위한 풍부한 기능을 제공합니다. 하지만 이벤트 스트림 처리시 발생하는 백 프레셔라는 개념은 알아두어야 할 중요한 부분입니다. 백 프레셔는 이벤트 스트림의 데이터 생산 속도와 소비 속도 사이의 불균형을 조절하기 위해 사용됩니다.
백 프레셔란?
백 프레셔는 생산자와 소비자 간의 데이터 흐름을 제어하는 방법입니다. 생산자는 데이터를 생성하여 이벤트 스트림에 넣고, 소비자는 이벤트 스트림을 구독하여 데이터를 처리합니다. 하지만 생산자와 소비자의 속도 불균형으로 인해 생산자가 데이터를 계속해서 생성하는데에 비해 소비자가 처리하지 못하는 상황이 발생할 수 있습니다. 이러한 상황에서 백 프레셔를 사용하면 생산자의 속도를 조절하여 데이터의 무리 현상을 방지할 수 있습니다.
백 프레셔의 종류
RxJava에서는 백 프레셔를 구현하기 위해 다양한 전략들을 제공합니다. 대표적으로 BUFFER
, DROP
, LATEST
세 가지 전략이 있습니다.
BUFFER
: 생산자가 생성한 모든 데이터를 저장하고 소비자가 처리할 때까지 대기합니다. 소비자가 처리한 후에는 그 다음 데이터를 전송합니다.DROP
: 생산자가 생성한 데이터 중 일부를 소비자가 처리할 수 없을 경우, 그 데이터를 단순히 버려버립니다. 즉, 데이터 손실이 발생할 수 있습니다.LATEST
: 생산자가 생성한 데이터 중 소비자가 처리하지 못한 최신 데이터만을 유지하고, 나머지 데이터는 버려버립니다.
기본적으로는 BUFFER
전략이 적용되지만, 필요에 따라 다른 전략으로 변경할 수 있습니다.
백 프레셔의 사용
RxJava에서는 백 프레셔를 적용하기 위해 Flowable
클래스를 사용합니다. Flowable
은 백 프레셔를 지원하는 옵저버블의 한 종류입니다. 백 프레셔를 적용하려면 Flowable
클래스의 onBackpressureBuffer()
, onBackpressureDrop()
, onBackpressureLatest()
등의 메서드를 사용하여 백 프레셔 전략을 설정해야 합니다.
Flowable.create(emitter -> {
// 데이터를 생성하여 이벤트 스트림에 넣는 작업
for (int i = 0; i < 100; i++) {
emitter.onNext(i);
}
emitter.onComplete();
}, BackpressureStrategy.BUFFER)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(data -> {
// 데이터를 처리하는 작업
System.out.println(data);
});
위 코드에서는 BackpressureStrategy.BUFFER
를 사용하여 BUFFER
전략을 설정하고 있습니다. 다른 전략을 사용하려면 해당 전략을 인자로 넣어주면 됩니다.
참고 자료
백 프레셔는 RxJava에서 이벤트 스트림 처리시 발생할 수 있는 데이터 생산-소비 불균형 문제를 해결하기 위한 중요한 개념입니다. 이를 이해하고 올바르게 사용하기 위해 다양한 백 프레셔 전략들에 대해 학습하고 적절히 선택해야 합니다. RxJava 공식 문서를 참고하여 자세한 정보를 얻을 수 있습니다.