Search

EDA(Event Driven Architecture)

EDA의 개념과 범위

Event Driven Architecture

서비스 간 이벤트를 이용해 비동기로 통신하는 구조

Martin Fowler 가 정의 한 Event-Driven

Event Notification : 이벤트 알림

어떤 변경 사항이 일어났음을 알리는 트리거 역할
이벤트에 포함되는 데이터는 id 등의 최소 정보가 포함 된다.

Event-Carried State Transfer : 이벤트 기반 상태 전송

이벤트에 변경 사항의 상세 내용을 포함
수신자는 해당 데이터의 사본을 유지 할 수 있음
customer 에 대한 상세 정보가 같이 오기 때문에 정보를 따로 요청하지 않고도 빠르게 서빙이 가능하다는 장점이 있다.

Event-Sourcing : 이벤트 소싱

데이터의 최종 상태 대신 모든 변경 내역을 이벤트로 저장 하는 방식
Event Store for Account는 모든 이벤트를 저장한다. 이 방식은 감사와 상태 변화 추적을 용이하게 하며, 특정 시점으로의 롤백을 가능케 한다. 최신 데이터 조회 시 리플레이가 수행되지만, 성능 최적화를 위해 주기적으로 최신 상태의 스냅샷이 저장된다. 단, 이 스냅샷은 원본 데이터가 아닌 파생 데이터로 간주된다.
운영 메커니즘: 스냅샷이 매시간 생성된다고 가정할 때, 데이터 조회 요청 시 시스템은 최신 스냅샷을 참조한다. 그 후, 해당 스냅샷 이후 발생한 이벤트만을 Event Store에서 추출하여 최종 상태를 산출한다. 이로써 전체 이벤트 이력을 처리하는 대신 효율적으로 최신 상태를 재구성할 수 있다.

CQRS : Command and Qurey Responsibility Segregation

데이터의 쓰기와 읽기가 분리되어 다른 모델, 다른 서비스를 통하게 됨
읽기 쓰기 성능이 다르기 때문에 분리하여 다른 요구사항에 적응할 수 있게 하는 패턴
이벤트 소싱을 사용하면 데이터의 쓰기와 읽기가 자연스럽게 분리된다. 읽기 작업은 스냅샷 DB와 이벤트 스토어의 계산된 결과를 활용한다.
이러한 특성으로 인해 이벤트 소싱은 CQRS(Command Query Responsibility Segregation) 패턴과 잘 어울린다. CQRS의 핵심은 명령(쓰기)과 쿼리(읽기) 서비스를 분리하는 것이다. CQRS의 주요 특징은 다음과 같다:
내부적으로 서로 다른 모델을 사용한다.
시스템의 구성요소가 명확히 분리된다.
클라이언트는 데이터 접근 시 명령과 쿼리를 구분하여 사용한다.
이 패턴의 주요 장점은 쿼리 서비스의 성능을 독립적으로 최적화할 수 있다는 점이다.
그러나 CQRS는 시스템의 복잡도를 증가시키므로, 필요한 경우에만 선택적으로 적용하는 것이 바람직하다.

EDA 의 장단점

장점

느슨한 결합(유연성)

확장성

실시간 처리

분산 아키텍처(MSA)

단점

복잡성

디버깅 어려움

일관성 관리

이벤트 소실 및 중복

EDA 사용 시나리오

이커머스 MSA 상태계
IoT 센서로 부터 데이터 스트림을 실시간으로 처리

EDA 구성 요소

이벤트 생산자

이벤트를 발행하는 주체
특정 이벤트의 발생 또는 상태 변경을 발행
소비자를 특정 하지 않는다
특정 사건의 발생을 이벤트 브로커를 통해 알릴 때, 어떤 소비자가 이 데이터를 소비할지 알 필요가 없다. 이는 느슨한 결합의 핵심 개념이다. 이러한 특성은 API 서비스와 대조적이다.

이벤트 소비자

이벤트를 소비하는 주체
특정 이벤트에 다수의 소비자가 존재할 수 있다.
한 이벤트에 대해 여러 소비자가 작업을 시작하는 병렬 처리 가능
이를 "fan-out"이라고 한다. API 호출의 경우, A 서비스가 다수의 처리를 해야 할 때 여러 다른 서비스를 호출해야 하므로 A 서비스에 부하가 발생한다.

이벤트 브로커

이벤트 생산자, 소비자를 연결하는 핵심 요소
일종의 큐(Queue) 역할
일정 기간 이벤트를 저장할 수 있는 기능 필요
단일 장애 포인트가 될 수 있음
다수의 연결(생산자, 소비자)을 처리할 수 있는 확장성 필요
오류 처리(Dead Letter Queue) 기능 필요
Dead Letter Queue : 제대로 처리되지 않은 이벤트를 보관해준다
특정 이벤트 처리 중 오류가 발생해 서비스가 중단되면, 해당 이벤트의 실행 여부를 확인할 수 없다. 이 경우, 이벤트 처리 상태를 표시하는 메커니즘이 필요하다. 그러나 지속적으로 오류가 발생할 수 있으므로, 이러한 문제가 있는 이벤트는 별도로 보관한다.