3.리액티브 스트림
리액티브 시스템을 기술적으로 구현하기 위해 필요한 코드에 대한 명세는 리액티브 스트림에 정의되어 있음
1. 리액티브 스트림
리액티브 스트림이란 리액티브 시스템을 구현하기 위해 리액티브 매니페스토에서 정의한 Responsive, Resilient, Elastic, Message-driven과 같은 특성을 Java 기반의 환경에서 구현하기 위해 명시한 기술 레벨의 스펙
리액티브 스트림에 대한 정의는 다음과 같음
Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. This encompasses efforts aimed at runtime environments (JVM and JavaScript) as well as network protocols.
→ 리액티브 스트림이란 논 블로킹 기반의 백 프레셔(Non-blocking, Back Pressure)를 통한 비동기적인 스트림 처리의 표준을 의미
2. 배압(or 역압), Back Pressure
배압(Back Pressure)이란 클라이언트(Consumer)가 자신이 처리할 수 있는 양 만큼만 데이터를 받아서 처리할 수 있도록 데이터를 발행하는 발행자(Publisher)에게 소비할 수 있는 만큼만 데이터를 요청하는 방식으로,
지나치게 빠른 데이터 스트리밍으로부터 데이터 전달이 폭주하는 현상을 막을 수 있는 수단이라고 볼 수 있음
3. 옵저버 패턴과 배압의 필요성
옵저버 패턴이란 디자인 패턴 중 하나로, 특정 객체의 상태 변화에 따라 이벤트를 동작시키기 위해 각 객체들의 상태를 관찰하는 관찰자(Observer)를 통해 작업을 처리하는 방식을 말함
만약 발행자가 1초에 10개의 뉴스를 발행하는데, 뉴스를 구독하는 구독자는 1초에 최대 1개씩 밖에 소비할 수 없으며 한 번에 전달 받을 수 있는 뉴스가 최대 5개라면 남은 5개의 뉴스에 대한 데이터 전달은 소실될 수 있음
따라서 리액티브 스트림에서는 배압을 통해 구독자가 발행자에게 자신이 소비할 수 있는 뉴스의 개수 만큼만 요청하여 데이터가 소실되지 않고 처리될 수 있도록 개선할 수 있음