Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

리액티브 프로그래밍 vs EDA(Event Driven Architecutre) (이진혁) #185

Open
LJH098 opened this issue Aug 7, 2024 · 0 comments
Open
Assignees
Labels

Comments

@LJH098
Copy link

LJH098 commented Aug 7, 2024

문제가 무엇인가?

리액티브 프로그래밍과 EDA는 어떤 차이점이 있을까?

왜 이런 문제를 선정하였는가?

리액티브 프로그래밍을 읽으면서 EDA와 많이 유사해보였는데 어떤 차이점이 있는지 궁금해졌다.

자신이 생각한 답변은 무엇인가?

리액티브 프로그래밍

개요

리액티브 프로그래밍은 비동기 데이터 스트림과 변화에 반응하는 프로그래밍 패러다임입니다. 주로 Project Reactor와 RxJava 같은 라이브러리를 사용합니다.

주요 특징

비동기 및 논블로킹: 데이터 처리가 비동기적으로 이루어지며, 블로킹을 피합니다.
데이터 스트림: 데이터 스트림을 통해 데이터가 흐르며, 연속적인 데이터 흐름을 처리합니다 (Flux, Mono).
역압력 지원: 리액티브 스트림 사양에 따라 역압력을 지원합니다. 데이터 생산자와 소비자 간의 속도를 조절하여 과부하를 방지합니다.
함수형 프로그래밍 스타일: 스트림 변환 및 조합에 중점을 두며, 함수형 프로그래밍 스타일을 많이 사용합니다.

사용 사례

실시간 데이터 처리 (예: 실시간 채팅 애플리케이션, 실시간 데이터 분석)
대규모 데이터 스트림 처리 (예: IoT 데이터 수집 및 분석)
고성능 웹 애플리케이션

이벤트 주도 아키텍처 (EDA)

개요

이벤트 주도 아키텍처는 시스템 구성 요소들이 이벤트를 통해 상호작용하는 아키텍처 스타일입니다. 각 컴포넌트는 독립적으로 이벤트를 발행하고 수신하여 비동기적으로 통신합니다.

주요 특징

이벤트 기반 통신: 시스템 컴포넌트 간의 상호작용이 이벤트를 통해 이루어집니다. 이벤트는 상태 변화나 중요한 동작을 나타냅니다.
느슨한 결합: 이벤트를 통해 통신함으로써 컴포넌트 간의 결합도를 낮춥니다.
확장성: 새로운 이벤트 유형이나 리스너를 쉽게 추가할 수 있어 확장성이 높습니다.
비동기 처리: 이벤트 발행과 처리 사이의 비동기성을 지원하여 성능과 응답성을 높입니다.

사용 사례:

마이크로서비스 아키텍처 (서비스 간의 이벤트 기반 통신)
복잡한 비즈니스 프로세스 오케스트레이션
사용자 활동 트래킹 (예: 사용자 행동에 따른 실시간 반응)
실시간 알림 시스템

차이점

초점

리액티브 프로그래밍: 데이터 스트림과 비동기 데이터 처리를 중심으로, 데이터 흐름의 변환 및 조합에 중점을 둡니다.
EDA: 시스템 컴포넌트 간의 비동기 이벤트 기반 통신에 중점을 둡니다. 시스템의 상태 변화를 이벤트로 표현하고 이를 기반으로 동작합니다.

역압력

리액티브 프로그래밍: 역압력을 통해 생산자와 소비자 간의 데이터 처리 속도를 조절합니다.
EDA: 일반적으로 역압력을 지원하지 않으며, 이벤트 큐잉 및 버퍼링을 통해 과부하를 처리합니다.

구현 방식

리액티브 프로그래밍: 함수형 프로그래밍 스타일을 많이 사용하며, 스트림 연산자를 통해 데이터를 변환하고 조합합니다.
EDA: 이벤트 발행자와 수신자 간의 느슨한 결합을 강조하며, 이벤트 브로커나 메시지 큐를 사용하여 이벤트를 전달합니다.

사용 목적

리액티브 프로그래밍: 실시간 데이터 스트림 처리와 고성능 비동기 시스템 구축에 주로 사용됩니다.
EDA: 시스템 구성 요소 간의 비동기 통신 및 확장 가능한 시스템 아키텍처 설계에 주로 사용됩니다.

결론

리액티브 프로그래밍과 이벤트 주도 아키텍처는 모두 비동기성과 높은 성능을 목표로 하지만, 그 적용 범위와 초점이 다릅니다. 리액티브 프로그래밍은 데이터 스트림 처리와 역압력에 중점을 두는 반면, EDA는 시스템 컴포넌트 간의 느슨한 결합과 이벤트 기반 통신에 중점을 둡니다. 두 가지 접근 방식을 적절히 결합하여 사용하면, 복잡한 비동기 시스템을 효과적으로 설계하고 구현할 수 있습니다.

번외

그렇다면 우리가 자주 사용하는 스프링 이벤트는 어떻게 역압력을 이용할 수 있을까?

  1. BlockingQueue 사용
  • 일정 크기의 BlockingQueue를 만들고 event publish 할 때 BlockingQueue에 집어넣고 subcribe 하는 부분에서 하나씩 꺼내서 사용하는 식으로 직접 설정
  1. Async를 사용하는 경우 threadPoolTaskExecutor 사용
  • 보통 스프링 이벤트는 비동기로 많이 사용하기 때문에 우리가 이전에 배운 병렬처리에 특화된 threadPoolTaskExecutor를 사용해서 queue의 크기를 설정
@LJH098 LJH098 added the ch17 label Aug 7, 2024
@LJH098 LJH098 self-assigned this Aug 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant