Intro::
EDA(Event Driven Architecture) 이벤트 기반 아키텍처에 대한 정리본입니다.
EDA란?
이벤트 기반 아키텍처(Event-Driven Architecture, EDA)는 이벤트를 중심으로 시스템이 동작하는 아키텍처 스타일입니다. 이 아키텍처에서는 이벤트가 발생할 때마다 이를 감지하고, 해당 이벤트에 반응하여 작업을 수행하는 방식으로 시스템이 설계됩니다. 이벤트 기반 아키텍처는 시스템 간 느슨한 결합(Loose Coupling)을 구현할 수 있어 대규모 시스템이나 복잡한 시스템에서 자주 사용됩니다.
이벤트(Event)
이벤트는 시스템 내에서 발생한 상태의 변화나 중요한 작업을 의미합니다. 예를 들어:
•
사용자 로그인 시도
•
제품 구매 완료
•
결제 승인
•
데이터베이스에 새로운 항목 추가
이러한 이벤트는 발생한 시점에 이벤트 발생(event emitted)되고, 이 이벤트에 반응하는 시스템 컴포넌트들이 있습니다.
핵심 컴포넌트
이벤트 기반 아키텍처는 이벤트 발행자와 이벤트 수신자라는 두 주요 역할로 이루어집니다.
이벤트 발행자(Event Producer)
이벤트 발행자는 어떤 중요한 작업이나 상태 변화가 발생했을 때, 이벤트를 생성하고 이를 발행(publish)하는 역할을 합니다. 발행자는 이벤트가 발생했다는 사실만 알릴 뿐, 그 이후 어떻게 처리될지는 신경 쓰지 않습니다.
•
예: 주문 시스템에서 주문이 완료되면 주문 완료 이벤트를 발행.
이벤트 수신자(Event Consumer)
이벤트 수신자는 발행된 이벤트를 구독(subscribe)하고, 이를 기반으로 작업을 처리합니다. 수신자는 특정 이벤트에 반응하여 작업을 수행하며, 여러 수신자가 하나의 이벤트에 반응할 수도 있습니다.
•
예: 주문 완료 이벤트를 구독하는 결제 시스템은 결제 승인을 처리하고, 알림 시스템은 사용자에게 알림을 전송.
이벤트 브로커(Event Broker)
이벤트 발행자와 수신자를 중재하는 이벤트 브로커는, 발행된 이벤트를 적절한 수신자에게 전달하는 역할을 합니다. 이를 통해 발행자와 수신자는 서로의 존재를 몰라도 되며, 느슨한 결합(Loose Coupling)을 유지할 수 있습니다.
•
예: Kafka, RabbitMQ, AWS SNS/SQS 같은 메시지 브로커가 이 역할을 수행할 수 있습니다.
이벤트 흐름
이벤트 기반 아키텍처에서 이벤트가 발생하고 처리되는 기본적인 흐름은 다음과 같습니다:
1.
이벤트 발생: 시스템에서 중요한 상태 변화나 작업이 완료되면 이벤트가 생성됩니다.
2.
이벤트 발행: 이벤트 발행자는 이벤트 브로커를 통해 이벤트를 발행합니다.
3.
이벤트 전달: 이벤트 브로커는 해당 이벤트를 적절한 수신자에게 전달합니다.
4.
이벤트 처리: 이벤트 수신자는 해당 이벤트를 받아 작업을 수행합니다.
이벤트 기반 아키텍처의 유형
이벤트 기반 아키텍처는 크게 두 가지 방식으로 구현될 수 있습니다:
단일 발행-단일 구독 (Single Producer-Single Consumer)
한 개의 발행자가 이벤트를 발생시키고, 그 이벤트를 단일 수신자가 처리합니다. 이는 간단한 경우에 적합하지만, 확장성이 제한될 수 있습니다.
단일 발행-다중 구독 (Single Producer-Multiple Consumers)
하나의 발행자가 이벤트를 발행하면 여러 수신자가 그 이벤트를 구독하고 각각 독립적으로 처리할 수 있습니다. 이를 통해 **확장성(Scalability)**과 확장 가능한 처리 방식을 구현할 수 있습니다.
다중 발행-다중 구독 (Multiple Producers-Multiple Consumers)
여러 발행자가 다양한 이벤트를 생성하고, 다수의 수신자가 이를 처리하는 형태입니다. 이벤트 기반 마이크로서비스 아키텍처에서 흔히 사용됩니다.
이벤트 기반 아키텍처의 장점
이벤트 기반 아키텍처는 다양한 상황에서 유용한 여러 장점을 가지고 있습니다.
느슨한 결합(Loose Coupling)
발행자와 수신자가 서로에 대해 알 필요가 없으며, 이벤트 브로커를 통해 간접적으로만 상호작용하므로 시스템 간 의존성이 줄어듭니다. 이로 인해 유연성이 증가하고, 개별 컴포넌트의 수정이나 확장이 쉬워집니다.
확장성(Scalability)
수신자는 필요에 따라 독립적으로 확장될 수 있습니다. 여러 수신자가 동일한 이벤트를 처리할 수 있어, 시스템 처리량을 늘리기 쉽습니다.
비동기 처리(Asynchronous Processing)
이벤트는 비동기로 처리될 수 있어, 시스템이 대기 시간 없이 바로 다음 작업을 처리할 수 있습니다. 이렇게 하면 특정 작업의 완료를 기다리지 않고도 다른 작업을 처리할 수 있으므로 효율성이 증가합니다.
실시간 처리(Real-time Processing)
이벤트가 발생한 순간 즉시 처리되므로, 실시간으로 데이터를 처리하는 시스템을 구현할 수 있습니다.
이벤트 기반 아키텍처의 단점
이러한 장점에도 불구하고, 이벤트 기반 아키텍처는 몇 가지 단점을 가지고 있습니다:
복잡성 증가
이벤트 기반 시스템은 구성 요소 간 결합은 줄이지만, 이벤트 흐름과 상호작용을 추적하기 어려울 수 있습니다. 특히 많은 이벤트가 발생하는 시스템에서는 어떤 이벤트가 어떤 수신자에 의해 처리되는지 파악하기 어려워 디버깅이 복잡해질 수 있습니다.
데이터 일관성 유지 어려움
이벤트 기반 시스템에서는 모든 처리가 비동기로 이루어지기 때문에, 데이터를 일관되게 유지하는 것이 어렵습니다. 이벤트가 중복 처리되거나 누락될 경우 데이터 불일치가 발생할 수 있습니다.
오류 처리 복잡성
이벤트 처리 중 오류가 발생했을 때 어떻게 복구할 것인지 명확한 전략이 필요합니다. 이벤트는 비동기로 전달되기 때문에, 이벤트 재처리나 롤백 전략을 설계하는 것이 복잡할 수 있습니다.
이벤트 기반 아키텍처의 실제 활용 예
이벤트 기반 아키텍처는 다음과 같은 다양한 상황에서 유용하게 활용됩니다:
•
마이크로서비스 아키텍처: 각 마이크로서비스가 서로 독립적으로 동작하면서 이벤트를 주고받음으로써 느슨한 결합을 유지할 수 있습니다.
•
실시간 처리 시스템: 금융 거래 처리, IoT 센서 데이터 처리, 실시간 알림 시스템 등에서 이벤트가 발생하자마자 즉시 처리해야 할 때.
•
데이터 스트리밍: Apache Kafka와 같은 시스템을 사용하여 실시간 데이터 스트리밍 및 처리.
•
전통적인 업무 시스템: 대형 전자상거래 시스템이나 은행 시스템에서 주문 처리, 결제 승인, 배송 상태 업데이트 등을 이벤트로 처리.