dev-sohee 님의 블로그

EDA(Event-Driven Architecture) 쉽게 이해하기 본문

EDA(Event-Driven Architecture) 쉽게 이해하기

dev-sohee 2024. 8. 17. 12:22

이벤트 기반 아키텍처(Event-driven architecture), 라는 단어의 뜻이 유추가 되시나요?

개발자에게 "이벤트(Event)"란, 시스템에서 발생하는 중요한 상태 변화나 동작을 의미합니다. 그렇다면 "아키텍처(Architecture)"는 무슨 뜻일까요? 아키텍처란, 구성 요소 간의 관계 및 시스템 외부 환경과의 관계를 설계화한 것, 쉽게 말해  서비스가 어떻게 구성되며 어떻게 동작이 되는지에 대한 설계도라고 생각하시면 되겠습니다.

그렇다면 이벤트 기반 아키텍처(EDA)는 이벤트를 기반으로 한 아키텍처, 즉 시스템에서 발생하는 이벤트를 중심으로 시스템이 동작하고 처리되는 구조와 흐름에 대한 설계라고 볼 수 있겠습니다.

이 글을 읽고 나면 누구나 EDA를 이해할 수 있도록 EDA에 대해 쉽게 설명해보겠습니다.

* EDA 구성 요소
* EDA 동작 방식
* EDA 특징

 

EDA에 대해 알아보기에 앞서, 먼저 MSA(MicroService Architecture)에 대해 간략하게 설명하겠습니다(자세한 내용은 'MSA: 마이크로서비스 아키텍처의 모든 것'을 참고해주세요). MSA는 소프트웨어 개발 기법의 하나로서, 단일 어플리케이션을 작은 서비스 모음으로 개발하는 접근 방식입니다. 다시 말해 MSA는, "하나의 큰 어플리케이션을 여러 개의 작은 어플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처"입니다.

출처_https://velog.io

 

MSA 방식은 넷플릭스의 마이크로서비스 전환 성공 사례와 넷플릭스 OSS(Open Source Software)라고 불리는 오픈소스 기반의 프레임워크가 좋은 레퍼런스가 되면서 많은 기업이 모놀로식(Monolithic) 아키텍처에서 MSA로 전환을 시도하고 있습니다.

MSA는 도커(Docker), 쿠버네티스(Kubernetes) 등과 같은 컨테이너 기반의 플랫폼과 클라우드 기반 환경에 적합해 높은 인기를 얻고 있습니다. 아마존, 넷플릭스, 이베이와 같은 글로벌 서비스 기업들도 사용할 만큼 MSA는 강력한 아키텍처입니다. 하지만 MSA 적용에는 개발 복잡도와 숙련도, 트랜잭션 관리, 통합 테스트의 어려움, 배포 복잡성 등과 같은 어려움이 있습니다. 이를 보완할 수 있는 아키텍처가 바로 EDA입니다.

**모놀로식(Monolithic) 아키텍처란? : 소프트웨어의 모든 구성요소가 한 프로젝트에 통합되어있는 형태입니다. 간단한 아키텍처이고, 유지보수가 용이하기 때문에 소규모 프로젝트에서 훨씬 합리적입니다.

 

출처_https://akasai.space/architecture/about_event_driven_architecture/

 

위의 그림처럼 단일 클라이언트와 단일 서버 간의 이벤트를 동기식으로 처리하는 아키텍처도 존재하지만, 대규모 분산 시스템, 실시간 데이터 처리 및 비동기 작업을 필요로 하는 어플리케이션은 아래 그림과 같은 EDA가 적합합니다.  

출처_https://akasai.space/architecture/about_event_driven_architecture/

 

 

# EDA 구성 요소

  1. Event Generator(Publisher, Producer, Creater)
    : 이벤트를 감지하고 감지한 이벤트를 메시지로 전달하는 역할을 합니다.
    ex) 고객이 사이트에서 주문을 하면 "Check Out" 이벤트가 발생하고 이벤트 프로듀서는 발생한 이벤트를 이벤트 채널로 전달합니다.
  2. Event Channel(Bus)
    : 이벤트가 전송되는 경로 또는 메시징 시스템이며, 이벤트를 전달하고 큐잉하는 역할을 합니다. 이벤트 처리 엔진은 거의 실시간으로 이벤트를 처리해야 하기 때문에 이벤트 채널은 비동기식으로 읽습니다.
  3. Event Processing Engine(Consumer, Processor)
    : 수신한 이벤트를 식별한 다음 이벤트에 맞는 반응을 실행하는 논리적 계층입니다.
    ex) 수신한 이벤트가 "Check Out"인 경우 "제품 ID 주문" 및 "직원에게 알림"과 같은 비즈니스 로직을 수행합니다.

 

# EDA 동작 방식

  1. 이벤트 생성(Event Generation)
    • 이벤트 프로듀서(Event Producer): 이벤트를 생성하는 주체로, 특정 비즈니스 작업이 발생했을 때 이벤트를 생성합니다. 이벤트 프로듀서는 시스템 내의 다양한 구성 요소가 될 수 있습니다.
    • 예시: 사용자가 웹사이트에서 주문을 완료하면 주문 서비스가 "Check Out" 이벤트를 생성합니다. 이 이벤트는 주문이 성공적으로 처리되었음을 나타냅니다.
  2. 이벤트 전송(Event Transmission)
    • 이벤트 채널(Event Channel): 생성된 이벤트를 전달하는 중개 역할을 합니다. 이 채널은 이벤트를 큐에 저장하거나, 이벤트 스트림을 관리하여 소비자에게 전달합니다. 메시징 시스템 또는 이벤트 브로커가 이 역할을 수행합니다.
    • 예시: Kafka, RabbitMQ, AWS SNS 등이 이벤트 채널로 사용될 수 있습니다. 이 시스템들은 이벤트를 큐에 저장하고, 이벤트를 구독한 소비자에게 전달합니다.
  3. 이벤트 소비(Event Consumption)
    • 이벤트 소비자(Event Consumer): 이벤트를 수신하고 처리하는 주체로, 이벤트가 발생할 때 이를 받아서 적절한 작업을 수행합니다. 이벤트 소비자는 이벤트를 기반으로 비즈니스 로직을 실행하거나, 시스템 상태를 업데이트합니다.
    • 예시: 결제 서비스가 "Check Out" 이벤트를 수신하여 결제를 처리하고, 배송 서비스가 주문 정보를 받아 배송을 준비합니다.

 

# EDA 특징

장점

  1. 비동기 처리 및 높은 반응성
    : 이벤트를 비동기적으로 처리할 수 있어 시스템의 반응성이 높아집니다.
    ex) 실시간 분석, 금융 거래 시스템 등에서 높은 응답 속도가 필요할 때 유용합니다.
  2. 느슨한 결합
    : 시스템의 구성 요소들이 이벤트를 통해 상호작용하므로, 서비스 간의 결합이 느슨해집니다. 이는 각 서비스가 독립적으로 개발, 배포, 유지보수될 수 있음을 의미합니다.
    ex) MSA와 함께 사용할 때, 서비스 간의 의존성을 줄이고 독립성을 유지할 수 있습니다.
  3. 확장성
    : 새로운 이벤트 소비자를 추가하거나 기존 소비자를 수정하는 것이 상대적으로 용이하여, 시스템의 확장성을 높일 수 있습니다.
    ex) 데이터 처리 파이프라인에 새로운 데이터 처리 모듈을 쉽게 추가할 수 있습니다.
  4. 실시간 데이터 처리
    : 실시간으로 이벤트를 처리할 수 있어 데이터 변경을 즉시 반영할 수 있습니다. 이는 실시간 모니터링, 알림, 분석 등에서 유용합니다.
    ex) IoT 시스템에서 센서 데이터를 실시간으로 수집하고 처리하는 데 효과적입니다.

단점

  1. 복잡한 이벤트 흐름 관리
    : 이벤트의 흐름과 전달 경로를 관리하는 것이 복잡할 수 있습니다. 이벤트가 다양한 소비자에게 전달되면서 복잡한 흐름을 추적하고 조정하는 데 어려움이 있을 수 있습니다.
    ex) 결제는 완료되었지만 재고가 업데이트되지 않아 고객이 주문한 상품이 실제로는 재고가 없을 수 있습니다.
  2. 디버깅과 모니터링의 어려움
    : 비동기식으로 이벤트를 처리하므로, 이벤트가 여러 시스템을 통과하면서 상태나 순서를 추적하기 힘들기 때문에 문제 발생 시 원인을 파악하거나 디버깅이 어려울 수 있습니다.
  3. 이벤트 설계 및 스키마 관리
    : 이벤트 스키마의 변경이 다른 시스템 구성 요소에 영향을 미칠 수 있어서, 일관성을 유지하기 위한 추가 작업이 필요할 수 있습니다.
    ex) 의료 시스템에서 이벤트 스키마가 변경되어 새로운 필드(ex) 새로운 검사 결과, 진료 노트 추가 등)가 추가되었는데, 기존 시스템이 이 새로운 필드를 인식하지 못한다면 데이터의 일관성이 깨질 수 있습니다.
  4. 트랜잭션 관리의 복잡성
    : 분산된 환경에서 이벤트를 처리할 때, 일관성과 트랜잭션 관리를 유지하는 것이 어려울 수 있습니다.
    ex) 고객이 두 개의 계좌 간에 돈을 이체할 때, 계좌 확인, 이체 실행, 잔액 업데이트 등 이체 요청이 성공적으로 처리되었지만 잔액이 제대로 업데이트되지 않는 문제가 발생할 수 있습니다. 

 

EDA는 비동기 처리와 유연한 확장성을 제공하지만, 복잡한 이벤트 흐름 관리, 디버깅, 트랜잭션 관리 등에서 까다로울 수 있습니다. 높은 성능의 웹 어플리케이션 개발을 위해 MSA와 EDA를 상호 보완적으로 사용할 줄 아는 개발자가 되어야겠습니다.