Overview
배압(Back Pressure)은 시스템의 한 구성요소가 감당할 수 있는 만큼의 작업량을 할당하여 전체 시스템을 안정적으로 유지하는 기법을 말합니다. Back Pressure는 사실 옵져버 패턴(Observer Pattern)의 데이터를 처리하는 방식과 유사합니다. 크게 Push 방식과 Pull 방식이 중 배압은 바로 Pull 방식의 데이터 처리 기법입니다.
Push
Push 방식은 Publisher가 Subscriber에게 이벤트를 밀어 넣는 방식입니다. 그런데 Publisher는 Subscriber의 상태를 고려하지 않고 이벤트를 전달하는 데에만 충실합니다. 만약 Subscriber가 이벤트를 빠르게 처리하지 못하면, 처리되지 못한 이벤트는 큐(Queue) 메모리 버퍼에 쌓이게 됩니다. 안타깝게도 서버가 가용할 수 있는 메모리는 한정되어 있고, 아래 그림은 메모리의 한계를 넘어설 만큼 많은 이벤트가 큐에 누적되었을때 발생하는 상황입니다.
)
고정길이 버퍼(bounded buffer)를 사용한다면, 신규로 수신된 이벤트는 버려집니다. 버려진 이벤트를 재처리 하도록 유도할 수 있지만, 이를 위해 추가 비용이 발생합니다. 가변길이 버퍼(unbounded buffer)를 사용한다면, OOM(out of memory)에러가 발생하면서 서버가 죽게 될수도 있습니다.
Pull
앞서 보았던 Push 방식의 근본적인 문제는 Publisher가 Subscriber의 상태를 고려하지 않기 때문에 발생합니다. Pull 방식은 Subscriber가 처리할 수 있는 만큼의 이벤트를 Publisher에 요청하여 이벤트를 처리하는 방식입니다. 바로 이것이 배압(Back Pressure)의 기본 원리입니다.
예를 들어, Subscriber가 10개의 이벤트를 처리할 수 있다면 Publisher에게 10개의 이벤트를 요청합니다. Publisher는 요청받은 만큼만 Subscriber에게 전달하면 되고, Subscriber 더 이상 버려지는 이벤트나 OOM(out of memory) 에러를 걱정하지 않아도 됩니다.
'IT > Spring WebFlux' 카테고리의 다른 글
Project Reactor (0) | 2020.12.13 |
---|---|
Event-Driven & WebFlux (0) | 2020.11.10 |
Non-Blocking (0) | 2020.11.07 |
Spring WebFlux (1) | 2020.11.06 |
Reactive? (0) | 2020.11.05 |