서비스간에 이벤트를 이용해 비동기로 통신하는 구조
EDA가 나타내는 것은 이벤트 알림, 이벤트 기반 상태 전송, 이벤트 소싱, CQRS가 있다.
이벤트 알림(Event Notification)
어떤 변경사항이 일어났음을 알리는 트리거 역할
이벤트에 포함되는 데이터는 id 등의 최소 정보만 갖는다.

이벤트 기반 상태 전송(Event-carried State Transfer)
이벤트에 변경사항의 상세 내용을 포함
수신자는 해당 데이터의 사본을 유지할 수 있다.

이벤트 소싱(Event Sourcing)
데이터의 최종 상태 대신 모든 변경내역을 이벤트로 저장하는 방식

CQRS(Command and Query Responsibility Segregation)
데이터의 쓰기와 읽기가 분리되어 다른 모델, 다른 서비스를 통하게 됨

주로 사용되는 EDA는 이벤트 알림과 이벤트 기반 상태 전송이 가장 일반적으로 도입할 수 있는 패턴이다. 이벤트소싱과 CQRS는 서비스 간의 통신보다는 데이터 관리에 치중된 방식이기 때문이다.
EDA의 장단점
장점
느슨한 결합(Loose Coupling)
- 컴포넌트간 느슨한 결합으로 컴포넌트 변경 영향도 최소화
- 비즈니스 로직을 독립적으로 수정 가능
확장성
- 분산과 비동기의 특성상 확장이 용이
- 확장의 대상은 이벤트 발행자, 소비자, 브로커가 될 수 있음
실시간 처리
- 실시간으로 끊임없이 생서외는 데이터를 처리하는데 유리
- 비동기의 특성으로 안정적으로 처리 가능
분산 아키텍처
- 분산 시스템의 특징으로 MSA에 잘 어울림
- MSA가 요구하는 서비스간의 낮은 결합도를 EDA의 느슨할 결합 특성이 충족시킴
단점
복잡성
- 직접 호출보다 비동기 통신은 이해하고 구현하기가 어려움
- 이벤트 브로커가 중간에 추가되는 등, 증가하는 컴포넌트로 인한 복잡도가 크다
디버깅
- 이벤트 흐름 추적이 어려움
- 정교한 모니터링 수단이 필요함
일관성 관리
- 비동기적 특성으로 인한 데이터 순서 보장이나 일관성의 문제
- 최종적 일관성 등의 다른 일관성 모델을 채택하는 방법이 존재
이벤트 소실 및 중복
- 네트워크 및 브로커의 오류로 인해 발생
- 이벤트가 소실되는 문제(처리 보증 장치 필요)
- 이벤트가 중복 처리되는 문제(멱등성 보장 필요)

EDA는 독립된 서비스가 비동기로 통신하는 느슨한 연결 구조에 사용하기 적합하다

IOT처럼 센서 등의 장비로부터 데이터 스트림을 실시간으로 처리하는 방식에 사용하기 적합하다
EDA의 구성요소
이벤트 생산자
- 이벤트를 발행하는 주체
- 특정 이벤트의 발생 또는 상태 변경을 발행
- 소비자를 특정하지 않는다
이벤트 소비자
- 이벤트를 소비하는 주체
- 특정 이벤트에 다수의 소비자가 존재할 수 있다
- 한 이벤트에 대해 여러 소비자가 작업을 시작하는 병렬 처리 가능
이벤트 브로커
- 이벤트 생산자와 소비자를 연결하는 핵심 요소
- 일종의 큐(Queue) 역할
- 일정 기간 이벤트를 저장할 수 있는 기능 필요
- 단일 장애 포인트가 될 수 있음
- 다수의 연결(생산자, 소비자)을 처리할 수 있는 확장성 필요
- 오류 처리(예: Dead Letter Queue) 기능 필요