시스템 아키텍트백엔드 아키텍트

이벤트 버스 패턴(Event Bus)에 대해 설명하고, 어디에 적용하며, 어떤 함정을 고려해야 하는지 설명해 주세요.

Hintsage AI 어시스턴트로 면접 통과

답변.

이벤트 버스 패턴(Event Bus)은 시스템의 구성 요소 간 통신을 이벤트의 게시 및 수신을 통해 구현할 수 있도록 하는 아키텍처 접근 방식입니다. 이때 구성 요소들은 서로를 직접 알지 못하고, "게시자-구독자" 원칙에 따라 느슨하게 연결된 상호 작용이 이루어집니다.

사용: 이 패턴은 많은 모듈 간에 확장 가능하고 확장 가능한 상호 작용을 보장해야 할 때 유용합니다. 예를 들어, 복잡한 웹 애플리케이션, 데스크톱 시스템, 마이크로서비스 플랫폼에서 사용됩니다.

Python 코드 예제(pyee 라이브러리 사용):

from pyee import EventEmitter bus = EventEmitter() def on_user_created(user): print(f"사용자가 생성되었습니다: {user}") bus.on('user_created', on_user_created) bus.emit('user_created', {"id": 1, "name": "이반"})

주요 특징:

  • 서비스를 통해 직접 통신하지 않고 버스를 통해 통신함으로써 모듈성을 높입니다.
  • 기존 코드를 변경하지 않고도 새로운 이벤트 처리기를 쉽게 추가할 수 있습니다.
  • 암묵적 의존성과 비즈니스 흐름 추적의 복잡성으로 인해 추적하기 어려운 오류가 발생할 수 있습니다.

함정 질문.

이벤트 버스의 모든 이벤트가 지속 가능해야 합니까?

아니요, 반드시 그렇지 않습니다. 대부분의 경우 이벤트 버스는 저장되지 않는 일시적인(ephemeral) 이벤트를 운영합니다. 이벤트의 손실 방지가 중요한 경우에만 지속성이 필요합니다(예: Kafka를 통해).

게시 시 구독자가 없으면 이벤트가 손실됩니까?

네, 시스템이 이벤트를 저장하지 않으면(ephermeral), 이벤트는 손실됩니다. 보장된 전달을 위해서는 지속 가능한 이벤트 버스(예: 지속적인 큐를 가진 RabbitMQ)가 필요합니다.

제한 없이 동기 및 비동기 코드에 하나의 이벤트 버스를 사용할 수 있습니까?

아니요, 동기 이벤트 버스는 모든 처리기가 완료될 때까지 스레드를 차단할 수 있으므로 높은 부하에 적합하지 않습니다. 확장 가능한 시스템에는 비동기 이벤트 버스를 사용하거나 이벤트 처리를 별도의 프로세스/스레드로 분리합니다(예: Celery를 통해).