MSA, EDA, Reactive 패러다임

Reactive System과 event-driven Architecture

코앤미 2023. 7. 6. 18:59

Reactive 패러다임

리액티브(Reactive) 패러다임은 비동기적인 데이터 흐름과 변경에 반응하는 프로그래밍 패러다임이다.

이 패러다임은 데이터 스트림에 대한 관찰과 반응을 중심으로 한다.

리액티브 시스템에서는 데이터의 변화나 이벤트를 발생시키는 작업들이 스트림 형태로 표현된다.

이 스트림은 연속적으로 도착하는 데이터나 이벤트의 시퀀스를 나타내며, 이러한 데이터 스트림에 대한 관찰과 처리가 중요한 역할을 한다.

리액티브 패러다임의 핵심 개념은 다음과 같다.

1) 데이터 스트림 (Data Streams)데이터 스트림은 시간에 따라 연속적으로 도착하는 데이터나 이벤트의 흐름을 나타낸다 이러한 데이터 스트림은 비동기적으로 처리되며, 변화에 따라 업데이트될 수 있다.

2) 옵저버블 (Observables): Observables은 데이터 스트림을 생성하고, 해당 스트림에 대한 관찰자(옵저버)를 등록할 수 있는 객체이다. Observables데이터의 발행과 완료, 오류 처리 등을 제어할 수 있다.

3) 옵저버 (Observers): 옵저버는 Observables로부터 전달되는 데이터 스트림을 관찰하고 처리하는 객체다.

옵저버는 데이터의 도착에 따라 적절한 작업을 수행하거나 데이터를 다른 형태로 변환할 수 있다.

4) 연산자 (Operators): 연산자는 Observables변환, 조합, 필터링, 변형하는 데 사용된다.

연산자를 사용하여 데이터 스트림을 가공하고, 복잡한 비즈니스 로직을 구현할 수 있다.

 

why Reactive ?

리액티브 패러다임은 데이터 스트림에 대한 관찰과 변형을 통해 비동기적인 프로그래밍을 구현한다.

- 대량의 데이터, 트래픽 처리: 리액티브 시스템은 async & non-blocking 방식으로 대량의 데이터 및 트래픽을 빠르게 처리할 수 있다.

-사용자 경험 향상: 리액티브 시스템은 실시간으로 변화하는 데이터에 신속하게 대응 가능하다.

ex) 실시간 업데이트, 자동완성, 실시간 알림 기능.

-분산 및  클라우드 컴퓨팅: 리액티브 시스템은 분산환경에서의 동작에 적합하고, 클라우드 컴퓨팅에서 효과적으로 사용 가능하다. 

-복잡성 관리: 복잡한 동시성, 상호작용을 가지는 시스템에 용이하다. 개발자가 더 쉽게 병렬 처리, 동시성 제어, 오류 처리를 구현할 수 있고, 코드의 가독성 및 유지 보수성도 향상된다(함수형 프로그래밍 기반의FRP).

- 탄력성과 확장성: 리액티브 시스템은 필요에 따라 구성요소를 동적으로 추가, 제거하여 탄력성, 확장성을 갖추고 있다.

이를 통해 시스템은 부하에 대응하고 변화에 유연하게 대처하고, 요구사항의 변화에도 쉽게 대응할 수

 

 

탄력성 ( Elesticity )

요청의 수 등 부하에 따라 시스템 처리량이 유연하게 변해야한다.

 

복원력(resilient) 과 탄성(resiliency)

- 시스템 특정 부분에 장애가 발생해도, 문제가 없어야한다.

- 이를 위해 내부 장애를 시스템의 다른 요소로 부터 격리해야한다.

ex) 결제 서비스가 장애로 인해 중단되어도, 사용자 주문을 접수 하고, 이후에 자동 재시도

 


리액티브 패러다임은 다양한 리액티브 라이브러리와 프레임워크를 통해 구현할 수 있으며, 대표적으로 ReactiveX, Reactor, Akka 등이 있다.

 

 

Reactive 시스템

리액티브 시스템은 리액티브 패러다임을 기반으로 구축된 소프트웨어 시스템이다. 

리액티브 시스템은 리액티브 패러다임의 원리와 개념을 적용하여 개발되며, 비동기적인 통신, 확장성, 탄력성, 고가용성, 내결함성 등의 특징을 가진다.

리액티브 시스템은 대량의 데이터 및 이벤트를 처리하고, 실시간 업데이트, 인터랙티브한 사용자 경험, 분산 환경에서의 작업 등을 다루는 데 적합하다.

  • MEANS : 리액티브 시스템에서 사용하는 커뮤니케이션 수단
    • Message Driven : 메시지 기반 통신을 통해 여러 시스템 간에 느슨한 결합을 유지
  • FROM : 메시지 기반 통신을 통해 리액티브 시스템이 어떤 특성을 가지는 구조로 형성되는지를 의미
    • Elastic
      • 시스템으로 들어오는 요청량이 적거나 많거나에 상관없이 일정한 응답성을 유지하는 것을 의미
    • Resillient
      • 시스템의 일부분에 장애가 발생하더라도 응답성을 유지하는 것을 의미
  • VALUE : 리액티브 시스템의 핵심 가치
    • Responsive
      • 리액티브 시스템은 클라이언트의 요청에 즉각적으로 응답할 수 있어야 한다.
    • Maintainable
      • 클라이언트의 요청에 대한 즉각적인 응답이 지속가능해야 한다.
    • Extensive
      • 클라이언트의 요청에 대한 처리량을 자동으로 확장하고 축소할 수 있어야 함을 의미

 

 

Reactive System- quick OverView

리엑티브 시스템를 구현하는 방법 중 대표적인건 Request-Response 방식과 Event-driven 방식이다.

결론만 말하자면, 요새 MSA 등의 트렌드를 고려했을 때, Event-Driven 방식이 선호되어지는 것 같다.

 

이에 대한 내용은 아래의 글에 자세히 설명해놓았다.

https://codenme.tistory.com/125

 

reactive System - Request-Response VS Event-Driven Application

Request-Response VS Event-Driven Application Request-Response 요청/응답 통신방법은 동기 통신에 단일 통신 방법으로, 요청자는 응답자의 주소를 알고 있어야 통신이 가능합니다. 이런 방식을 Point to Point 방식

codenme.tistory.com

 

이제, 이벤트 기반 아키텍처와 그를 위해 사용하는 비동기 메세지 통신에 대해 살펴보자.

 

이벤트 기반 아키텍처(event-driven architecture)

리액티브 시스템은 비동기 메세지 통신을 사용한 이벤트 기반 아키텍처를 주로 활용하여 이벤트 중심적인 상호작용을 구현한다. 이벤트가 발생하면 해당 이벤트를 감지하고 처리하기 위해 이벤트 리스너를 등록한다. 이벤트 기반 아키텍처는 이벤트에 따라 상태 변경 및 처리 작업을 수행하며, 실시간 업데이트, 자동 완성, 실시간 알림과 같은 인터랙티브한 사용자 경험을 제공한다.

 

비동기 방식의 이벤트 기반 아키텍처는 이벤트 중심적인 상호작용과 비동기적인 처리를 강조한다.

이때 주로 비동기 메세지 통신 방식을 이용해 느슨한 연계를 지향한다.

이벤트에 반응한다는 의미로 이벤트 기반 아키텍처(event driven architecture)라고 부르는데, 이벤트 기반 아키텍처는 예전부터 사용된 개념으로서 분산 시스템 간에 발신자가 이벤트를 생성 및 발행(publish)하고, 해당 이벤트를 필요로 하는 수신자에게 전송하면 이벤트를 구독하고(subscribe) 있던 수신자가 이벤트를 받아 처리하는 형태의 시스템 아키텍처이다.

여기서 이벤트는 '상태의 변화'를 의미하며, 기존의 순차적 방식의 아키텍처와 달리 특정 행동이 자동으로 순서에 따라 발생하는 것이 아닌 어떤 상태의 변경에 대한 반응으로 동작한다는 점이 차이점이다.

이벤트 기반 아키텍처는 이벤트를 생산하는 모듈과 이벤트에 대응하는 모듈을 분리하고 상호 독립적으로 동작하게 함으로써 병렬 처리를 촉진한다. 또한 이러한 이벤트 기반 아키텍처의 전달 메커니즘으로 앞에서 논의한 비동기 메시지 메커니즘을 선택하면 더욱더 효과적이다. 

 

리액티브 시스템 구현에서 사용하는 이유

이벤트 기반의 아키텍처와 비동기 통신 메커니즘을 함께 사용하는 마이크로서비스를 이벤트 기반 마이크로서비스(event-driven microservice)라고도 한다. 이벤트 메시지를 사용하면 발신자와 수신자를 장소와 시간에서 쉽게 분리할 수 있으며, 마이크로서비스가 추구하는 느슨한 결합으로 확장성, 탄력성 측면에서 이점이 많다.

 

- 비동기성: 이벤트 기반 아키텍처는 비동기 메시지 통신을 기반으로 하므로, 여러 이벤트를 병렬적으로 처리하고 응답성을 향상시킬 수 있다.
- 확장성: 느슨한 결합과 비동기 통신을 통해 각 컴포넌트를 독립적으로 확장하고 부하 분산을 쉽게 처리할 수 있다.

 

 

 

메세지 기반 비동기 통신(Pub/Sub(게시/구독) 모형)

리액티브 시스템에서는 주로 메시지 기반 아키텍처를 활용하여 구성 요소 간에 비동기적인 메시지 통신을 수행한다. 이를 위해 메시지 큐, 이벤트 버스 또는 메시징 프로토콜 등을 사용하여 구성 요소 간의 상호작용을 조정합니다. 메시지 기반 아키텍처는 구성 요소 간의 느슨한 결합, 확장성, 탄력성을 제공하며, 대용량 데이터 처리와 비동기 작업 처리를 용이하게한다.

 

 

비동기 메세지 통신은 서비스와 서비스간의 통신 사이메세징 큐 혹은 메세지 브로커를 통하여 통신 한다.

벤트를 발송하는 부분을 publisher(게시자) or producer(제공자) 라고 부르고, 이벤트를 받아서 처리하는 부분을 subscriber(구독자) or receiver(수신자),consumer(소비자) 라 부른다. 용어가 다양한 이유는 메세지 브로커 별로 호칭하는것이 다르기 때문이다. 일반적으로 Pub/Sub(게시/구독) 모형이라고 호칭한다.

 

비동기(asynchronous) 호출이기에 동기 호출처럼 응답을 기다리지 않고 다음 일을 처리한다.

하지만 보낸 결과가 어떻게 됐는지 응답을 받지 않으므로 동기식처럼 완결성을 보장할 수는 없다.
이를 보장하기 위한 메커니즘으로 아파치 카프카(Apache Kafka), 래빗엠큐(RabbitMQ), 액티브엠큐(ActiveMQ) 같은 메시지 브로커(Message broker)를 활용한다.

 


메시지를 보내는 생산자(producer)와 메시지를 가져다가 처리하는 소비자(consumer)가 서로 직접 접속하지 않고 메시지 브로커에 연결된다. 메시지 브로커에 메시지를 전달하고 자신의 일을 처리하면 메시지 브로커가 전송을 보장하게 된다.

 

장점

비동기성: 비동기 메시지 통신은 작업을 비차단적으로 처리하는 방식으로, 한 작업이 완료될 때까지 다른 작업을 기다리지 않고 다른 작업을 수행한다. 이는 시스템의 응답성과 처리량을 향상시키고, 여러 작업을 동시에 처리하고 병렬성을 활용할 수 있다.

느슨한 결합: 메세지 브로커를 통해서 통신하고, 비동기 방식으로 인해 다른작업을 기다리지 않기에 컴포넌트간의 결합도 or 의존성이 낮다. 이는 시스템의 확장성을 높이고, 컴포넌트를 독립적으로 확장하거나 대체할 수 있게 한다.

 

유연성: 비동기 메시지 통신은 메시지를 이벤트나 명령, 쿼리 등 다양한 형태로 주고받을 수 있다. 이는 시스템의 유연성을 높이고, 다양한 상황에 대처할 수 있게 한다. 또한, 비동기 메시지 통신은 메시지 큐, 메세지 브로커를 통해 메시지를 중재하고 전달할 수 있으므로, 메시지의 도착 순서를 보장하거나 메시지 처리를 조절하는 데 유용하다.

 

이러한 특성으로 인해 서비스 요구에 따라 늘어나거나 줄어들 수 있는 탄력성이 높은 클라우드 플랫폼 환경에서 서비스가 다운됐을 때 또는 시스템을 더 확장해야 할 때 효과적으로 사용 할 수 있다.

 

 

async & non-blocking 

기존의 Spring MVC 모델, 그리고 RestTemplate등을 활용한 통신에서는 Multi-Thread, sync & Blocking 방식으로

하나의 Thread가 Block되면 다른 Thread를 cpu에 할당하는 등의 방식으로 Block 된 기간동안의 대기시간을 완화하였지만,

cpu에 새로운 작업을 할당하기 위해 드는 비용인 Context Switching 의 비용으로 인해 여전히 성능적 문제가 있다.

그렇기에 async & non-blocking 는 대규모 데이터 처리 및 높은 트래픽 등에서 좋은 성능을 발휘한다.

 

자세한 비교는 아래의 글을 참고하자.

https://codenme.tistory.com/123

 

WebFlux VS Spring MVC

이번 글에선 이론적으로 WebFlux가 Spring MVC에 대비해 어떤 이점이 있는지 분석하고, 외부의 performance Test를 이러한 이론을 증명하겠습니다. WebFlux를 사용하는 이유는? - aync & Non-blocking방식으로 인

codenme.tistory.com

 

 

요약

Reactive System은 일반적으로 async & non-blocking 개념이 베이스가 되는 이벤트 기반 아키텍처(비동기 메세지 통신 기반)를 사용한다. 

 

- async & non-blocking: 더 나은 사용자 사용성, 데이터 처리 속도

 

- 메시지 기반 아키텍처: 리액티브 시스템에서는 메시지 기반 아키텍처를 활용하여 구성 요소 간에 비동기적인 메시지 통신을 수행한다. 비동기 통신은 동기 통신과 다르게 완결성이 보장되지 않기에, 메세지 브로커등을 사용한다.

 메시지 기반 아키텍처는 구성 요소 간의 느슨한 결합, 확장성, 탄력성을 제공하며, 대용량 데이터 처리와 비동기 작업 처리를 용이하게한다.

- 이벤트 기반 아키텍처: 리액티브 시스템은 이벤트 기반 아키텍처를 활용하여 이벤트 중심적인 상호작용을 구현한다.

 이벤트 기반 아키텍처는 이벤트에 따라 상태 변경 및 처리 작업을 수행하며, 실시간 업데이트, 자동 완성, 실시간 알림과 같은 인터랙티브한 사용자 경험을 제공한다.

 

ex) 메시지 기반 비동기 통신을 통해 구성 요소 간에 메시지를 교환하고 독립적으로 작업을 수행하며, 동시에 비동기 방식의 이벤트 기반 아키텍처를 사용하여 이벤트에 대응하고 상호작용

 

이러한 설계는 리액티브 시스템이 유연하고 반응성이 뛰어난 특징을 제공하는 데 도움을 준다.