[Reactive] 08. Backpressure

Jimin Lim·2024년 3월 25일
0

Spring

목록 보기
15/18
post-thumbnail
post-custom-banner

8.1 Backpressure란?

  • Backpressure: Publisher가 끊임없이 emit하는 무수히 많은 데이터를 적절하게 제어하여 데이터 처리에 과부하가 걸리지 않도록 제어하는 것

위 상황에서 emit된 데이터들은 Subscriber가 data 1을 처리하기 전까지 대기하게 된다. 이때 data 1의 처리 속도가 느리고 Publisher의 emit 속도가 빠르다면 오버플로우가 발생하게 된다. 이러한 문제를 해결하기 위한 수단이 Backpressure!

8.2 Reactor에서의 Backpressure 처리 방식

8.2.1 데이터 개수 제어

Subscriber가 적절히 처리할 수 있는 수준의 데이터 개수를 Publisher 에게 요청

 Flux.range(1, 5)
            .doOnRequest(data -> log.info("# doOnRequest: {}", data))
            .subscribe(new BaseSubscriber<Integer>() {
                @Override
                protected void hookOnSubscribe(Subscription subscription) {
                // onSubscribe() 대신 구독 시점에 request() 메서드 호출해 최초 데이터 오청 개수 제어 
                    request(1);
                }

                @SneakyThrows
                @Override
                protected void hookOnNext(Integer value) {
                //onNext() 대신해 publisher가 emit한 데이터를 전달받아 처리한 후 Publisher에게 또다시 데이터 요청 
                    Thread.sleep(2000L); //subscriber의 처리 속도가 느리도록 지연설정
                    log.info("# hookOnNext: {}", value);
                    request(1);
                }
            });

8.2.3 Backpressure 전략 사용

Reactor에서 지원하는 Backpressure 전략을 사용하는 것, onBackpressureXXX() Operator 를 사용해 적용할 수 있다.

Ignore

  • Downstream에서의 Backpressure 요청이 무시되기에 IllegalStateException 발생

Error

  • Downstream의 데이터 처리 속도가 느려 Upstream의 emit 속도를 따라가지 못할 경우 IllegalStateException 발생

Drop

  • Publisher가 Downstream으로 전달할 데이터가 버퍼에 가득 찰 경우, 버퍼 밖에서 대기 중인 데이터 중 먼저 emit된 데이터부터 Drop시킨다. (Drop된 데이터는 폐기)
    • Step4에서 버퍼 밖에서 대기 중인 데이터가 Drop되는 것을 확인할 수 있다.

LATEST

  • Publisher가 Downstream으로 전달할 데이터가 버퍼에 가득 찰 경우, 버퍼 밖에서 대기 중인 데이터 중에서 가장 나중에 emit된 데이터부터 버퍼에 채우는 전략
    • Step4에서 버퍼가 비었고, 가장 나중에 emit된 17부터 채워지고 나머지는 폐기된다.

-> 현재 emit된 데이터를 나라고 가정한다면 DROP전략은 나 자신을 폐기하는 것이고, LATEST 전략은 내 앞을 폐기하는 것

BUFFER

  • 버퍼의 데이터를 폐기하지 않고 버퍼링을 하는 전략도 지원하지만, 버퍼가 가득 차면 버퍼 내의 데이터를 폐기하는 전략, 그리고 버퍼가 가득차면 에러를 발생시키는 전략도 지원한다.
    • DROP_LATEST: 가장 나중에 버퍼 안에 채워진 데이터를 Drop
    • DROP_OLDEST: 버퍼 안에 채워진 데이터 중 가장 오래된 데이터 DROP
profile
💻 ☕️ 🏝 🍑 🍹 🏊‍♀️
post-custom-banner

0개의 댓글