Event‐Driven Architecture - low-hill/Knowledge GitHub Wiki

Event-Driven Architecture(EDA)란?

이벤트 기반 아키텍처는 실시간으로 발생하는 이벤트를 중심으로 설계된 현대적인 소프트웨어 아키텍처 패턴입니다. 이 아키텍처에서는 사용자 인터페이스(UI)에서 버튼 클릭, 온라인 쇼핑몰 장바구니에 아이템 추가, 결제 완료 알림 등과 같은 이벤트를 처리하고, 발생하는 즉시 이를 소비하는 시스템으로 전달합니다. 전통적인 request/response 아키텍처가 주로 정의된 주기적 요청에 반응하고, 사용자가 명시적으로 요청한 사항에 대해 처리하는 방식이라면, 이벤트 기반 아키텍처는 비동기적이고 실시간으로 발생하는 이벤트에 기반하여 시스템을 처리합니다.

핵심 구성 요소

이벤트 기반 아키텍처는 이벤트를 중심으로 설계되며, 이 이벤트는 시스템의 출발점이자 처리 과정입니다. 이 아키텍처에서 주요 구성 요소는 다음과 같습니다:

  1. Publisher Publisher는 이벤트를 생성하고 이를 브로커나 메시징 시스템을 통해 전달하는 역할을 합니다. 이벤트 데이터는 중앙 저장소나 큐에 저장될 수 있으며, 이는 후속 처리를 위한 데이터 흐름을 만들어냅니다.

  2. Subscriber Subscriber는 특정 이벤트를 수신하여 이를 처리하는 시스템이나 컴포넌트입니다. Subscriber는 관심 있는 이벤트를 수신하고, 이를 바탕으로 특정 동작을 수행하거나, 다른 시스템과의 연계를 통해 추가 처리를 진행합니다.

  3. sources 이벤트가 발생하는 출처입니다. 사용자 입력, 시스템 상태 변화, 외부 시스템의 알림 등이 모두 소스가 될 수 있습니다. 이벤트의 소스는 다양한 형태로 존재할 수 있으며, 이를 통해 실시간 데이터 흐름이 시작됩니다.

  4. sinks 싱크는 이벤트가 최종적으로 전달되는 목적지입니다. 구독자가 처리한 이벤트 데이터는 저장소, 데이터베이스, 다른 애플리케이션의 API 등으로 전송되어 최종 결과를 저장하거나 후속 처리를 진행합니다.

이벤트 처리 흐름

이벤트 기반 아키텍처의 핵심은 이벤트 처리의 흐름입니다. 일반적으로 다음과 같은 과정으로 이루어집니다:

  1. 이벤트 생성: 사용자의 행동이나 시스템의 변화로 인해 이벤트가 발생합니다. 예를 들어, 사용자가 온라인 쇼핑몰에서 상품을 장바구니에 추가하면 장바구니 추가 이벤트가 발생합니다.

  2. 이벤트 발행: 이벤트는 출판자에 의해 발생하고, 이를 메시징 시스템(예: Kafka, RabbitMQ)이나 이벤트 브로커를 통해 전파합니다.

  3. 이벤트 소비(consume): Subscriber는 관심 있는 이벤트를 구독하여 수신하고, 수신된 이벤트에 따라 적절한 처리를 수행합니다. 예를 들어, 결제 시스템은 결제 완료 이벤트를 구독하여 결제 결과에 따른 후속 처리를 진행합니다.

  4. 결과 전달: 이벤트 처리 결과는 싱크로 전달되며, 여기서 데이터가 저장되거나, 추가적인 시스템과의 통합이 이루어집니다.

이벤트 기반 아키텍처의 장점

  1. 실시간 응답성 (Real-Time Responsiveness) 이벤트 기반 아키텍처는 이벤트를 실시간으로 감지하고 즉시 반응할 수 있습니다. 이를 통해 사용자나 다른 시스템에서 발생하는 이벤트에 대해 low latency으로 반응할 수 있으며, 사용자 경험이 더욱 인터랙티브하고 몰입감 있게 개선됩니다.
  2. 확장성 및 유연성 (Scalability and Flexibility) 채팅 및 메시징 애플리케이션처럼 수많은 동시 사용자와 메시지를 처리해야 하는 시스템에서는 확장성이 매우 중요합니다. 이벤트 기반 아키텍처는 수평 확장을 지원하며, 시스템의 부하를 여러 인스턴스나 마이크로서비스에 분배할 수 있습니다. 이를 통해 트래픽 증가나 변동하는 수요에 원활하게 적응할 수 있으며, 성능이나 신뢰성을 저하시키지 않고 확장할 수 있습니다.
  3. 느슨한 결합 및 모듈화 (Loose Coupling and Modularity) 이벤트 기반 아키텍처는 애플리케이션 구성 요소 간의 **느슨한 결합(loose coupling)**을 촉진합니다. 각 구성 요소는 독립적으로 작동하며, 하나의 구성 요소에 대한 변경이 다른 구성 요소에 영향을 미치지 않도록 합니다. 이러한 모듈화 덕분에 구성 요소는 시스템 내의 다른 부분이나 다른 애플리케이션에서 재사용할 수 있어, 개발 시간과 비용을 절감할 수 있습니다.
  4. 비동기 처리(Asynchronous Processing) 이벤트 기반 아키텍처는 비동기적인 특성을 가지므로, 시스템은 이벤트가 발생하는 즉시 반응할 수 있으며, 다른 작업을 차단하지 않고 독립적으로 처리할 수 있습니다. 이는 실시간으로 발생하는 데이터나 요청에 빠르게 대응할 수 있게 합니다.
  5. 확장성 및 통합 (Extensibility and Integration) 이벤트 기반 아키텍처는 이벤트를 활용하여 타사 API, 서비스, 데이터베이스와의 통합을 쉽게 할 수 있게 합니다. 이를 통해 애플리케이션의 기능 확장 및 호환성을 높일 수 있으며, 예를 들어 사용자 인증, 데이터 저장소, 분석 기능 등 추가적인 기능을 손쉽게 구현할 수 있습니다.
  6. 보안 및 개인정보 보호 (Security and Privacy) 이벤트 기반 아키텍처는 실시간 채팅이나 메시징 애플리케이션에서 필요한 보안 기능을 제공할 수 있는 강력한 토대를 제공합니다. 개발자는 액세스 제어, 인증, 암호화와 같은 보안 조치를 다양한 수준에서 구현할 수 있습니다. 이를 통해 무단 접근을 방지하고 민감한 정보를 안전하게 보호할 수 있습니다.
  7. 자원 소비 절감 (Reduced Resource Consumption) 이벤트 기반 아키텍처는 푸시 기반으로 동작하므로 이벤트가 발생할 때만 이를 처리합니다. 이 방식은 지속적인 폴링을 필요로 하지 않기 때문에 CPU 자원 소모와 대역폭 소비를 줄여줍니다. 시스템 자원 사용을 최적화하고, 불필요한 자원 낭비를 줄이는 데 효과적입니다.

이벤트 기반 아키텍처(EDA)는 실시간 이벤트를 처리하고, 비동기적이며 확장 가능한 시스템을 구축할 수 있는 유연한 소프트웨어 아키텍처입니다. 이벤트의 생성, 전파, 소비, 처리 과정을 통해 다양한 시스템이 협력하며 효율적으로 동작할 수 있도록 도와줍니다. 이는 특히 마이크로서비스, 스트림 처리, 실시간 시스템 등에 유용하게 활용됩니다.

마이크로서비스와의 적합성: 이벤트 기반 아키텍처는 마이크로서비스 아키텍처와 매우 잘 맞습니다. 마이크로서비스들은 독립적으로 실행되는 서비스들로, 각 서비스는 특정 이벤트를 구독하여 자신에게 필요한 동작을 처리합니다. 이를 통해 서비스 간의 결합도를 낮추고, 각 서비스는 독립적으로 확장하고 배포할 수 있습니다.


Reference