이번 글에서는 리액티브 프로그래밍과 리액티브 스트림이 무엇인지,
또 자바 8부터 제공하는 스트림 API와 리액티브 스트림은 뭐가 다른건지 등 헷갈리는 개념들을 정리하도록 하겠습니다.
리액티브 선언문 (Reactive Manifesto)
리액티브 선언문( https://www.reactivemanifesto.org/ )에서는 리액티브한 애플리케이션과 시스템 개발의 4가지 핵심 원칙을 정의합니다.
반응성 (responsive)
리액티브 시스템은 빠를 뿐만 아니라 더 중요한 특징으로 일관성 있는 응답 시간을 제공하고, 신뢰할 수 있는 예상 시간의 상한선을 설정하여 일관된 서비스 품질을 제공합니다.
이러한 일관된 동작은 오류 처리를 단순화하고, 일반 사용자에게 신뢰를 조성하고, 새로운 상호작용을 촉진합니다.
회복성 (resilient)
리액티브 시스템은 장애가 발생해도 응답해야 합니다.
탄력성은 복제(replication), 방지(containment), 분리(isolatuin), 위임(delegation)에 의해 실현됩니다.
장애는 각각의 구성 요소에 포함되며 구성 요소들은 서로 분리되어 있기 때문에 이는 시스템이 부분적으로 고장이 나더라도, 전체 시스템을 위험하게 하지 않고 복구할 수 있도록 보장합니다.
각 구성 요소의 복구 프로세스는 다른 외부의 구성 요소에 위임되며 필요한 경우 복제를 통해 고가용성이 보장됩니다.
구성 요소의 클라이언트는 장애를 처리하는데에 압박을 받지 않습니다.
탄력성 (elasic)
리액티브 시스템은 생명주기동안 다양한 작업 부하를 받게 됩니다.
시스템에 가해지는 작업 부하가 변화하더라도 응답성을 유지하는 것을 탄력성이라 합니다.
리액티브 시스템은 입력 속도의 변화에 따라 이러한 입력에 할당된 자원을 증가시키거나 감소키면서 변화에 대응합니다.
이것은 시스템에서 경쟁하는 지점()이나 중앙 집중적인 병목 현상(bottleneck)이 존재하지 않도록 설계하여, 구성 요소를 수평 분할(shard)하거나 복제하여 입력을 분산시키는 것을 의미합니다.
리액티브 시스템은 실시간 성능을 측정하는 도구를 제공하여 응답성 있고 예측 가능한 규모 확장 알고리즘을 지원합니다.
메시지 주도 (Message-driven)
리액티브 시스템은 느슨한 결합, 격리 및 위치 투명성을 보장하는 구성 요소 간의 경계를 설정하기 위해 비동기(asynchronous) 메시지 전달에 의존합니다.
비동기(asynchronous) 메시지 전달을 통해 컴포넌트 끼리의 통신이 발생하며, 이 덕분에 장애를 메시지로 위임하는 수단을 제공합니다.
또한 시스템의 메시지 대기열을 형성 및 모니터링하고 필요할 때 역압(backpressure)을 적용하여 부하 관리, 탄력성 및 흐름 제어가 가능합니다.
역압(backpressure)
역압은 데이터를 소비하는 측에서, 처리 가능한 만큼의 데이터양을 제공자측에 역으로 요청하는 기능을 의미합니다.
데이터 제공자와 데이터 소비자가 서로 다른 쓰레드에서 비동기로 데이터를 처리하는 경우 둘의 속도가 일치하지 않아 데이터를 처리하지 못하거나, 오랜 시간 데이터를 기다리는 등의 문제가 발생할 수 있습니다.
이를 역압을 통해 해결할 수 있습니다.
애플리케이션 수준의 리액티브
애플리케이션 수준에서의 리액티브 프로그래밍의 주요 장점은 작업을 비동기로 수행할 수 있다는 것입니다.
리액티브 스트림 (Reactive Streams)
리액티브 스트림은 non-bloking한 역압이 있는, 잠재적으로 무한의 비동기 데이터를 순서대로 처리하는 표준 기술입니다.
넷플릭스, 레드햇, 트위터, 라이트벤드 및 기타 회사들이 리액티브 스트림 프로젝트에 참여하였으며, 모든 리액티브 스트림 구현이 제공해야 하는 최소 기능들의 집합을 네 개의 인터페이스(Publisher, Subscriber, Subscription, Processor)로 정의하였습니다.
자세한 내용은 다음 사이트를 참고해주세요. (https://www.reactive-streams.org/)
리액티브 스트림에 대한 구현체로 RxJava, Reactor, 자바의 java.util.concurrent.Flow 등이 존재합니다.
(코루틴은 Reactive Streams의 구현체가 아닙니다. 이건 제가 처음에 헷갈렸던 부분이라..)
자바 스트림 API ?
스트림은 자바 8 API에 새로 추가된 기능으로, 스트림을 통해 컬렉션 데이터를 투명하게 병렬로 처리할 수 있습니다.
리액티브 스트림과는 무관한 다른 기술입니다.
리액티브 프로그래밍 (Reactive Programming)
비동기적 데이터 흐름(stream)을 처리하는 선언적 프로그래밍 패러다임입니다.
Reference
[Coroutine Flow] 1. Flow란 무엇인가?
Coroutine의 Flow는 데이터 스트림이며, 코루틴 상에서 리액티브 프로그래밍 지원 하기 위한 구성요소이다. 이를 이해하기 위해서는 먼저 리액티브(반응형) 프로그래밍이 무엇인지, 그리고 Flow가 리
kotlinworld.com
https://github.com/HomoEfficio/dev-tips/blob/master/Kotlin-Coroutine-vs-Reactive-Streams(Reactor).md
GitHub - HomoEfficio/dev-tips: 개발하다 마주쳤던 작은 문제들과 해결 방법 정리
개발하다 마주쳤던 작은 문제들과 해결 방법 정리. Contribute to HomoEfficio/dev-tips development by creating an account on GitHub.
github.com
https://boxfoxs.tistory.com/430
명령형 프로그래밍 VS 선언형 프로그래밍
명령형 프로그래밍과 선언형 프로그래밍에 대한 비교를 어디선가 한 번쯤은 접해봤을 거라 생각합니다. 그리고 그 둘이 실제로 무엇을 의미하는지 검색을 해보셨다면 아마 아래와 같은 정의를
boxfoxs.tistory.com
'리액티브 프로그래밍 > 기본 지식' 카테고리의 다른 글
[Reactive Programming] [2] - 병렬성(Concurrency)과 동시성(Parallelism) (0) | 2022.07.09 |
---|