카테고리 | 게시글 작성 날짜 | 게시글 최근 수정 날짜 | 작성자 |
Operating System | 2022.03.09. 14:21 | 2022.03.09. 14:21 | Dev.Yang |
🛠 리액티브 프로그래밍 (Reactive Programming)이란?
데이터가 통지될 때마다 관련 프로그램이 반응 (Reaction)하여 데이터를 처리하는 프로그래밍 방식입니다. 즉, 데이터 흐름을 통하여 데이터를 받은 시점에 반응하여 이를 처리하는 프로그래밍입니다.
🛠 Reactive Streams이란?
라이브러리 (Library)나 프레임워크 (Framework)에 상관없이 데이터 스트림 (Data Stream)을 비동기로 다룰 수 있는 공통적인 메커니즘입니다. Reactive Streams 구성으로는 생산자 (Publiser)와 소비자 (Subscriber)로 구성됩니다. 생산자와 소비자의 관계는 구독 (Subscribe)를 통하여 데이터를 주고받습니다.
- 생산자 (Publisher) → 데이터를 통지하는 대상입니다.
- 소비자 (Subscriber) → 데이터를 받아 처리하는 대상입니다.
🛠 Reactive Streams 기본 규칙, 프로토콜, 인터페이스
Reactive Streams 기본적인 규칙은 아래와 같습니다.
- 구독 시작 통지 (onSubscribe)는 해당 구독에서 단 한 번만 발생합니다.
- 통지는 순차적으로 이루어집니다.
- NULL을 통지하지 않습니다.
- 생산자 (Publisher)의 처리는 완료 (onComplete) 또는 에러 (onError)를 통지하여 종료합니다.
리액티브 스트림 (Reactive Streams) 제공하고 있는 기본적인 프로토콜은 아래의 도표와 같습니다.
프로토콜 (Protocol) | 설명 |
onSubscribe | 데이터 통지가 준비됐음을 통지하는 프로토콜입니다. |
onNext | 데이터 통지하는 프로토콜입니다. |
onError | 에러(이상 종료)를 통지하는 프로토콜입니다. |
onComplete | 완료(정상 종료)를 통지하는 프로토콜입니다. |
리액티브 스트림 (Reactive Streams) 제공하고 있는 기본적인 인터페이스는 아래의 도표와 같습니다.
인터페이스 (Interface) | 설명 |
Publisher | 데이터를 생성하고 통지하는 인터페이스입니다. |
Subscriber | 통지 된 데이터를 전달받아 처리작업을 수행하는 인터페이스입니다. |
Subscription | 데이터 개수를 요청하고 구독을 해지하는 인터페이스입니다. |
Processor | Publisher 그리고 Subscriber의 기능을 모두 가지고 있는 인터페이스입니다. |
🛠 Cold 생산자와 Hot 생산자란?
❄️ Cold 생산자
- 1개의 소비자와 구독관계를 가집니다.
- 기본적으로 생성이 되는 메서드로 생성되는 생성자는 Cold 생산자입니다.
- 구독시 구독되는 시간에 상관없이 데이터는 처음부터 현재까지의 데이터를 전부 전달받습니다.
🔥 Hot 생산자
- 여러 소비자와의 구독 관계를 가집니다.
- 구독시 구독되는 시간 이후부터 데이터를 전달받습니다.
🛠 배압 (Backpressure)
데이터 통지량을 제어하는 기능을 뜻하며, Reactive Stream을 따르는 Flowable에서만 제공하고 Obserable에서는 제공하지 않습니다.
아래의 도표는 배압 (Backpressure) 종류를 설명하는 도표와 관련 이미지입니다.
종류 | 설명 |
BUFFER | 데이터를 통지할 수 있는 상태가 될 때까지 모든 데이터를 버퍼에 저장하고 있습니다. |
DROP | 데이터를 통지할 수 있는 상태가 될 때까지 새로 생성되는 모든 데이터를 파기합니다. |
LATEST | 생성한 최신 데이터만을 버퍼에 저장하고, 새로운 데이터가 생성하면 버퍼에 담긴 데이터를 최신의 데이터로 교체합니다. |
ERROR | 통지를 기다리는 데이터가 지정 된 사이즈의 버퍼를 초과하면 MissingBackPressureException 에러를 통지합니다. |
NONE | 특정 처리 작업을 수행하지 않습니다. |
🛠 Difference between Flowable to Observable
- Flowable
- 대량 데이터 (예를 들어서 10,000건 이상)을 처리하고자 하는 경우
- 네트워크 통신이나 데이터베이스 등의 I/O 처리하고자 하는 경우
- Observable
- GUI 이벤트
- 소량 데이터 (예를 들어 1,000건 이하)를 처리하고자 하는 경우
- 데이터 처리가 기본으로 동기 방식이며, Java 표준의 Stream 대신 사용하고자 하는 경우
🛠 결합 연산자 (Combine Operator)
zpi 연산자 메서드는 인자로 전달이 된 여러 개의 Flowable/Obserable에서 데이터를 받아 데이터들이 모인 시점에 이 데이터들을 함수형 인터페이스에 전달하고 이 함수형 인터페이스에서 새로 생성 된 데이터를 결과로 통지하는 연산자입니다.
merge 연산자 메서드는 여러 개의 Flowable/Observable에서 받은 데이터를 하나의 Flowable/Obserable로 통지하는 연산자입니다. 또한, 여러 개의 Flowable/Observable에서 받은 데이터를 순차적으로 통지합니다.
🛠 리엑티브 프로그래밍 (Reactive Programming) 용어 정리
- 데이터 스트림 (Data Stream) → 각각의 데이터가 생성될 때마다 순서대로 보내는 흐름입니다.
- 리액티브 시스템 (Reactive System) → 메세지를 보내 데이터를 처리하고 상황에 따라 스케일 아웃 (Scale Out)과 스케일 인 (Scale In)을 자동으로 수행하여 장애 내성을 높임으로써 항상 빠르게 응답할 수 있는 시스템입니다.
- 연산자 (Operator) → 통지하는 데이터를 생성하거나 필터링 또는 변환하는 메서드입니다.
- 스로틀링 (Throttling) → 대량으로 받은 데이터를 모두 흘려보내는 것이 아니라 제한을 두어서 지정 된 기간 조건에 맞는 테이터만을 통지하는 메서드입니다.
- 스케줄러 (Schduler) → 개발자가 직접 스레드 (Thread)를 관리하지 않게 각 처리 목적에 맞춰 스레드 (Thread)를 관리합니다. 또한, 스케줄러 (Schdler)는 데이터를 생성하여 통지하는 부분과 데이터를 받아서 처리하는 부분으로 지정합니다.
🚀 REFERENCE
'#컴퓨터 과학 [Computer Science] > 운영체제 (Operating System)' 카테고리의 다른 글
[OS - 🍎 macOS] SwiftUI (0) | 2022.02.16 |
---|---|
[⚙️ 운영체제] 명령형 프로그래밍 언어 (Imperative Language)와 함수형 프로그래밍 언어 (Functional Language) (0) | 2022.01.04 |
[OS - 🍎 macOS] Build ARM OpenSSL 1.1.1 (How to Compile OpenSSL 1.1.1 for Apple Silicon) (0) | 2021.05.04 |
[OS - 🍎 macOS] Xcode 이전 버전 다운로드 (Older versions of Xcode) (0) | 2021.05.02 |
[OS - 🍎 macOS] Building a Universal macOS Binary (0) | 2021.04.25 |
댓글