이 글은 ReactiveX - Intro를 번역한 글입니다.
Original Text
ReactiveX
ReactiveX는 observable sequences를 사용하여 비동기(asynchronous) 및 이벤트 기반 프로그램(event-based programs)을 작성하기 위한 라이브러리입니다.
옵져버 패턴(observer pattern)을 확장하여 데이터 및 / 또는 이벤트의 시퀀스를 지원하고 낮은 수준의 스레딩(low-level threading), 동기화(synchronization), 스레드 안전성(thread-safety), 동시 데이터 구조(concurrent data structures,) 및 논 블로킹 I/O(non blocking I/O)과 같은 문제를 추상화하는 동시에 선언적으로 시퀀스를 조합 할 수있는 연산자를 추가합니다.
Observables는 여러 항목의 비동기 시퀀스(asynchronous sequences)에 액세스하는 이상적인 방법이므로 간격을 메웁니다.
|
single items |
multiple items |
synchronous |
T getData() |
Iterable<T> getData() |
asynchronous |
Future<T> getData() |
Observable<T> getData() |
때로는 "functional reactive programming"이라고도하지만 이는 잘못된 이름입니다.
ReactiveX는 함수형(functional)일 수도 있고 리액티브(reactive)일 수도 있지만 "functional reactive programming"은 다른 동물입니다.
차이점 중 하나는
functional reactive programming은 시간이 지남에 따라 지속적으로 변하는 값에서 작동하는 반면
ReactiveX는 시간이 지남에 따라 방출되는 불연속 값에서 동작한다는 것입니다.
(functional reactive programming에 대한 자세한 정보는 Conal Elliott의 작업을 참조하십시오.)
Why Use Observables?
ReactiveX Observable 모델을 사용하면 배열과 같은 데이터 항목 컬렉션에 사용하는 것과 동일한 종류의 단순하고 구성 가능한 작업으로 비동기 이벤트 스트림을 처리 할 수 있습니다. 그것은 콜백의 얽힌 웹에서 당신을 자유롭게하고, 따라서 코드를 더 읽기 쉽고 버그를 적게 만듭니다.
Observables Are Composable
Java Futures와 같은 기술은 단일 레벨의 비동기 실행(single level of asynchronous execution)에 사용하기 쉽지만 중첩 될 때 적지 않은 복잡성을 추가하기 시작합니다.
(또는 각 요청의 대기 시간이 런타임에 다양하기 때문에 불가능 함).
물론 이렇게 할 수는 있지만 복잡해지며 (따라서 오류가 발생하기 쉽다) 또는 Future.get ()을 조기에 차단하여 비동기 실행의 이점을 없애줍니다.
Observables Are Flexible
ReactiveX Observables는 단일 스칼라 값(single scalar values, Futures처럼)뿐만 아니라 값의 시퀀스(sequences of values) 또는 무한 스트림(infinite streams)의 배출도 지원합니다. Observable은 이 유스 케이스에 사용할 수있는 단일 추상화입니다. Observable은 미러 이미지 사촌 인 Iterable과 관련된 모든 유연성(flexibility)과 우아함(elegance)을 갖추고 있습니다.
event |
Iterable (pull) |
Observable (push) |
retrieve |
T next() |
onNext(T) |
discover |
throws Exception |
onError(Exception) |
complete |
!hasNext() |
onCompleted() |
Observables Are Less Opinionated
Observables은 덜 독선적입니다.
ReactiveX는 동시성 또는 비 동시성의 특정 소스에 편향되지 않습니다. Observables는 스레드 풀, 이벤트 루프, 논 블로킹 I / O, 액터 (예 : Akka) 또는 요구 사항, 스타일 또는 전문 지식에 적합한 구현을 사용하여 구현할 수 있습니다. 클라이언트 코드는 Observables와의 모든 상호 작용을 기본 구현이 블로킹 또는 비 블로킹 여부에 관계없이 비동기로 처리하지만 이를 구현하도록 선택합니다.
이 Observable은 어떻게 구현됩니까?
public Observable<data> getData(); |
호출자와 동일한 스레드에서 동기적으로 작동합니까? 그것은 별개의 스레드에서 비동기적으로 작동합니까? 어떤 순서로든 호출자에게 데이터를 반환 할 수있는 여러 스레드를 통해 작업을 분할합니까? 스레드 풀 대신 액터 (또는 여러 액터)를 사용합니까? 비동기 네트워크 액세스를하기 위해 NIO를 이벤트 루프와 함께 사용합니까? 그것은 콜백 스레드에서 작업 스레드를 분리하는 이벤트 루프를 사용합니까? |
Observer의 관점에서 볼 때, 그것은 중요하지 않습니다!
그리고 중요한 것은 ReactiveX를 사용하여 나중에 당신의 마음을 바꿀 수 있고, Observable의 Consumer를 없애지 않으면서 Observable 구현의 근본적인 특성을 바꿀 수 있다는 것입니다.
Callbacks Have Their Own Problems
콜백에는 자신만의 문제가 있습니다.
콜백은 Future.get()의 빠른 블로킹 문제를 해결합니다. 응답 준비가 되면 실행되므로 자연스럽게 효율적입니다.
그러나 Futures와 마찬가지로 콜백은 단일 레벨의 비동기 실행으로 사용하기 쉽고 중첩된 컴포지션을 사용하면 다루기 힘들어집니다.
Reactive Programming
ReactiveX는 Observables를 필터링, 선택, 변환, 결합 및 작성할 수있는 연산자(operators) 모음을 제공합니다. 이를 통해 효율적인 실행 및 구성이 가능합니다.
Observable 클래스는 "pull"인 Iterable에 해당하는 "push"로 생각할 수 있습니다. Iterable을 사용하면 소비자는 값이 도달 할 때까지 제작자와 스레드 블록에서 값을 가져옵니다. 대조적으로 Observable을 사용하면 값을 사용할 수있을 때마다 생산자가 소비자에게 값을 푸시합니다. 값이 동기적 또는 비동기적으로 도착할 수 있기 때문에이 방법은 보다 융통성이 있습니다.
예제 코드) 유사한 고차 함수(high-order functions)가 Iterable과 Observable에 어떻게 적용될 수 있는지
Iterable |
Observable |
getDataFromLocalMemory() .skip(10) .take(5) .map({ s -> return s + " transformed" }) .forEach({ println "next => " + it }) |
getDataFromNetwork() .skip(10) .take(5) .map({ s -> return s + " transformed" }) .subscribe({ println "onNext => " + it }) |
Observable 유형은 Gang of Four의 Observer pattern에 두 개의 누락 된 의미를 추가합니다.
Iterable 유형에서 사용할 수 있는 것이 어울리는 :
- 더 이상 사용할 수있는 데이터가 없다는 것을 소비자에게 알릴 수있는 능력
(Iterable의 foreach 루프가 완료되고 그러한 경우에 정상적으로 복귀하며, Observable이 옵저버의 onCompleted 메소드를 호출) - 생산자가 소비자에게 오류가 발생했다는 신호를 보내는 능력
(반복 중에 오류가 발생하면 Iterable은 예외를 throw하고 Observable은 관찰자의 onError 메서드를 호출 함)
이러한 추가 기능을 통해 ReactiveX는 Iterable 및 Observable 유형을 조화시킵니다. 이들 간의 유일한 차이점은 데이터가 흐르는 방향입니다. 이것은 Iterable에서 수행 할 수있는 모든 연산이 가능하기 때문에 Observable에서도 수행 할 수 있기 때문에 매우 중요합니다.
'Devlopment > Reactive, Concurrency' 카테고리의 다른 글
리액티브란 무엇인가? (What's in a Name : Reactive) (0) | 2017.01.10 |
---|---|
리액티브 프로그래밍 대 리액티브 시스템 (Reactive Programming vs Reactive Systems) (0) | 2017.01.09 |
리액티브 스트림(Reactive Streams) (0) | 2017.01.04 |
데이터 스트림 (0) | 2016.12.29 |
동시성 관련 분류 (0) | 2016.12.27 |
vert.x VS Akka (0) | 2016.11.22 |
리액티브 프로그래밍이란 무엇입니까? What is reactive programming? (0) | 2016.11.21 |
1. 소프트웨어 패러다임 - 성능 그리고 동시성 (0) | 2016.11.17 |
동시성(Concurrency) vs 병렬성(Parallelism) (0) | 2016.11.17 |
synchronous, asynchronous, blocking, non-blocking (0) | 2016.10.31 |