본문 바로가기
Program Development Tips/Software Architecture

이벤트 기반 아키텍처 (Event-Driven Architecture) 완벽 가이드

by Maccrey Coding 2024. 9. 4.
728x90
반응형

 

이벤트 기반 아키텍처(Event-Driven Architecture, EDA)는 시스템의 구성 요소들이 이벤트를 통해 상호작용하는 구조를 말합니다.

이 아키텍처는 시스템의 확장성, 유연성, 비동기 처리를 지원하며, 대규모 분산 시스템에서 많이 사용됩니다.

이번 글에서는 이벤트 기반 아키텍처의 기본 개념을 소개하고, 파이썬을 활용한 실습 예제를 통해 초급부터 고급 개발자까지 이해할 수 있도록 설명하겠습니다.

이벤트 기반 아키텍처란 무엇인가?

이벤트 기반 아키텍처는 다음과 같은 핵심 요소로 구성됩니다:

  1. 이벤트 (Event): 시스템에서 발생하는 상태 변화나 중요한 사실을 나타냅니다. 예를 들어, 사용자가 버튼을 클릭하거나 데이터가 변경되는 등의 활동이 이벤트입니다.
  2. 이벤트 생성기 (Event Producer): 이벤트를 생성하는 컴포넌트입니다. 예를 들어, 사용자 인터페이스에서 버튼 클릭 이벤트가 발생합니다.
  3. 이벤트 소비자 (Event Consumer): 이벤트를 수신하고 처리하는 컴포넌트입니다. 예를 들어, 이벤트를 기반으로 알림을 보내는 서비스입니다.
  4. 이벤트 브로커 (Event Broker): 이벤트를 전달하고 분배하는 역할을 합니다. 메시지 큐나 스트리밍 플랫폼이 여기에 해당합니다.

이 아키텍처의 주요 장점은 비동기 처리, 확장성, 시스템 간의 느슨한 결합 등이 있습니다.

파이썬을 활용한 이벤트 기반 아키텍처 예제

이번 예제에서는 간단한 이벤트 기반 시스템을 구현해보겠습니다.

이 시스템은 사용자의 행동을 이벤트로 생성하고, 이벤트를 처리하여 로그를 기록하는 구조를 가지고 있습니다.

 

1. 프로젝트 구조

event_driven_architecture/
│
├── event_producer/
│   ├── producer.py
│   └── requirements.txt
│
├── event_consumer/
│   ├── consumer.py
│   └── requirements.txt
│
└── event_broker/
    ├── broker.py
    └── requirements.txt
2. 이벤트 브로커 (Event Broker)

event_broker/broker.py 파일에는 이벤트를 전달하고 큐잉하는 역할을 수행하는 간단한 이벤트 브로커를 구현합니다.

# event_broker/broker.py

from queue import Queue
import threading

class EventBroker:
    def __init__(self):
        self.queue = Queue()

    def publish(self, event):
        self.queue.put(event)

    def subscribe(self):
        while True:
            event = self.queue.get()
            if event is None:  # 종료 신호
                break
            print(f"Event received: {event}")

if __name__ == "__main__":
    broker = EventBroker()
    consumer_thread = threading.Thread(target=broker.subscribe)
    consumer_thread.start()
    
    # 예제 이벤트 발행
    broker.publish("User logged in")
    broker.publish("User clicked button")
    
    # 종료 신호
    broker.publish(None)
    consumer_thread.join()

requirements.txt 파일에는 필요한 패키지를 명시합니다.

# 필요 패키지 없음

 

3. 이벤트 생성기 (Event Producer)

event_producer/producer.py 파일에는 이벤트를 생성하고 브로커에 전송하는 역할을 수행합니다.

# event_producer/producer.py

import time
from event_broker.broker import EventBroker

def generate_events(broker):
    events = ["User logged in", "User clicked button", "User logged out"]
    for event in events:
        print(f"Publishing event: {event}")
        broker.publish(event)
        time.sleep(2)

if __name__ == "__main__":
    broker = EventBroker()
    generate_events(broker)

requirements.txt 파일에는 필요한 패키지를 명시합니다.

# 필요 패키지 없음

 

4. 이벤트 소비자 (Event Consumer)

event_consumer/consumer.py 파일에는 브로커로부터 이벤트를 수신하고 처리하는 소비자 역할을 수행합니다.

# event_consumer/consumer.py

from event_broker.broker import EventBroker
import threading

class EventConsumer:
    def __init__(self, broker):
        self.broker = broker

    def process_events(self):
        while True:
            event = self.broker.queue.get()
            if event is None:  # 종료 신호
                break
            print(f"Processing event: {event}")

if __name__ == "__main__":
    broker = EventBroker()
    consumer = EventConsumer(broker)
    
    consumer_thread = threading.Thread(target=consumer.process_events)
    consumer_thread.start()
    
    # 예제 이벤트 발행
    broker.publish("User signed up")
    broker.publish("User updated profile")
    
    # 종료 신호
    broker.publish(None)
    consumer_thread.join()

requirements.txt 파일에는 필요한 패키지를 명시합니다.

# 필요 패키지 없음

 

5. 실행하기

1. 각 서비스의 디렉토리로 이동하여, 필요한 패키지를 설치합니다. (패키지 설치가 필요하지 않음)

pip install -r requirements.txt

2. 각 컴포넌트를 실행합니다.

# 이벤트 브로커 실행
python event_broker/broker.py
# 이벤트 생성기 실행
python event_producer/producer.py
# 이벤트 소비자 실행
python event_consumer/consumer.py

3. 브로커에서 이벤트가 처리되고, 생성기와 소비자 간의 상호작용을 확인할 수 있습니다.

 

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

  1. 비동기 처리: 이벤트가 비동기로 처리되어 시스템의 응답성과 성능을 향상시킵니다.
  2. 확장성: 각 컴포넌트가 독립적으로 확장될 수 있으며, 이벤트 브로커를 통해 서비스를 수평 확장할 수 있습니다.
  3. 유연성: 시스템의 구성 요소들이 느슨하게 결합되어 있어, 변경이 용이합니다.
  4. 실시간 처리: 실시간으로 이벤트를 처리하고 반응할 수 있습니다.

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

  1. 복잡성: 이벤트 흐름과 시스템 간의 상호작용이 복잡해질 수 있습니다.
  2. 디버깅: 이벤트 흐름을 추적하고 문제를 디버깅하는 것이 어려울 수 있습니다.
  3. 데이터 일관성: 이벤트 기반 시스템에서 데이터 일관성을 유지하는 것이 도전이 될 수 있습니다.

 

이벤트 기반 아키텍처는 비동기 처리, 확장성, 유연성을 제공하는 강력한 설계 패턴입니다.

파이썬을 활용한 간단한 예제를 통해 이벤트 생성기, 브로커, 소비자 간의 상호작용을 실습하고, 이 아키텍처의 기본 개념을 이해할 수 있었습니다.

이 구조를 활용하여 대규모 분산 시스템을 효과적으로 설계하고 관리할 수 있기를 바랍니다.

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

 

728x90
반응형