TIL : 이벤트 드리븐 아키텍처와 스트림 처리 (Spring Cloud Stream)

Skadi·2024년 8월 14일
0

1. 이벤트 드리븐 아키텍처 (Event-Driven Architecture)


1.1 이벤트 드리븐 아키텍처란?

이벤트 드리븐 아키텍처(EDA)는 시스템 내에서 발생하는 이벤트(상태 변화나 사용자 행동)를 중심으로 시스템을 설계하는 소프트웨어 아키텍처 스타일입니다. EDA는 비동기적으로 이벤트를 처리하여 시스템의 응답성을 높이고, 서비스 간의 느슨한 결합을 통해 독립적인 개발과 배포가 가능하도록 합니다. 이러한 아키텍처는 대규모 시스템에서 특히 유용하며, 이벤트 발생 시 자동으로 적절한 서비스가 트리거되는 방식으로 동작합니다.

1.2 주요 개념

  • 이벤트(Event): 시스템 내에서 발생하는 상태 변화나 행동을 나타내는 메시지입니다. 예를 들어, 사용자가 온라인 쇼핑몰에서 주문을 완료하면, '주문 생성'이라는 이벤트가 발생할 수 있습니다.

  • 이벤트 소스(Event Source): 이벤트를 생성하여 이벤트 버스에 전달하는 역할을 합니다. 예를 들어, 주문 서비스는 '주문 생성' 이벤트의 소스가 될 수 있습니다.

  • 이벤트 핸들러(Event Handler): 이벤트를 수신하여 처리하는 역할을 합니다. 예를 들어, '주문 생성' 이벤트를 수신한 재고 서비스는 재고를 확인하고 업데이트하는 작업을 수행합니다.

  • 이벤트 버스(Event Bus): 이벤트 소스와 이벤트 핸들러 간의 메시지 전달을 중개하는 역할을 합니다. Kafka, RabbitMQ와 같은 메시지 브로커가 이벤트 버스의 역할을 할 수 있습니다.

1.3 이벤트 드리븐 아키텍처의 장점

  • 느슨한 결합 (Loose Coupling):

    • 이벤트 드리븐 아키텍처는 서비스 간의 강한 종속성을 제거하여 독립적인 개발과 배포를 가능하게 합니다.
    • 서비스들은 이벤트를 통해 간접적으로 통신하므로, 서로의 내부 구현에 대해 알 필요가 없습니다. 이는 시스템의 모듈성을 높이고, 변경에 대한 영향을 최소화합니다.
  • 확장성 (Scalability):

    • EDA는 수평 확장이 용이하여 대규모 시스템에서 매우 유용합니다.
    • 이벤트 프로듀서와 컨슈머를 독립적으로 확장할 수 있어, 특정 서비스의 부하가 증가할 때 유연하게 대응할 수 있습니다.
  • 비동기 처리 (Asynchronous Processing):

    • 이벤트를 비동기적으로 처리하여 시스템의 응답성을 높입니다.
    • 사용자는 이벤트가 발생한 즉시 응답을 받을 수 있으며, 실제 작업은 나중에 백그라운드에서 처리될 수 있습니다.

1.4 이벤트 드리븐 아키텍처의 단점

  • 복잡성 증가:

    • 이벤트 기반 통신은 시스템의 복잡성을 증가시킬 수 있습니다. 특히 이벤트 흐름을 추적하고 관리하는 것이 어렵습니다.
    • 이벤트의 상호작용을 체계적으로 설계하고, 상태 변화를 잘 관리해야 합니다.
  • 장애 전파:

    • 이벤트 처리 중 장애가 발생할 경우, 해당 이벤트에 의존하는 다른 서비스로 장애가 전파될 수 있습니다.
    • 이러한 문제를 방지하기 위해, 이벤트 재처리(replay)와 장애 복구(recovery) 메커니즘을 구현해야 합니다.

1.5 예시: 온라인 쇼핑몰의 이벤트 드리븐 아키텍처

  1. 이벤트 소스: 사용자가 온라인 쇼핑몰에서 주문을 완료합니다. 주문 서비스는 '주문 생성'이라는 이벤트를 발생시킵니다.

  2. 이벤트 버스: Kafka 또는 RabbitMQ와 같은 메시지 브로커가 '주문 생성' 이벤트를 이벤트 핸들러들에게 전달합니다.

  3. 이벤트 핸들러:

    • 재고 서비스: '주문 생성' 이벤트를 수신하여 주문된 상품의 재고를 확인하고, 재고 수량을 업데이트합니다.
    • 배송 서비스: '주문 생성' 이벤트를 수신하여 배송 준비를 시작합니다.
    • 결제 서비스: '주문 생성' 이벤트를 수신하여 결제 처리를 진행합니다.

이 예시에서 각 서비스는 독립적으로 동작하며, 이벤트를 통해 필요한 작업을 수행합니다. 이는 서비스 간의 강한 결합을 피하고, 각 서비스가 개별적으로 확장 가능하도록 합니다.

2. Spring Cloud Stream


2.1 Spring Cloud Stream이란?

Spring Cloud Stream은 마이크로서비스 아키텍처에서 이벤트 드리븐 애플리케이션을 쉽게 구축할 수 있도록 도와주는 프레임워크입니다. Spring Cloud Stream은 Kafka, RabbitMQ와 같은 메시지 브로커와의 통합을 지원하며, 이를 통해 이벤트 스트리밍을 간편하게 처리할 수 있습니다. 개발자는 복잡한 메시지 브로커와의 통합 작업을 간소화하고, 이벤트 프로듀서와 컨슈머 간의 통신을 추상화된 방식으로 처리할 수 있습니다.

2.2 주요 특징

  • 바인더 추상화 (Binder Abstraction):

    • Spring Cloud Stream은 메시지 브로커와의 통합을 위해 바인더라는 추상화 레이어를 제공합니다.
    • Kafka, RabbitMQ 등 다양한 메시지 브로커를 지원하며, 바인더를 통해 개발자는 브로커에 대한 세부 사항을 신경 쓰지 않고 애플리케이션을 개발할 수 있습니다.
  • 프로듀서/컨슈머 모델 (Producer/Consumer Model):

    • Spring Cloud Stream은 이벤트를 생성하는 프로듀서와 이벤트를 수신하여 처리하는 컨슈머 모델을 지원합니다.
    • 이 모델을 통해 이벤트 기반 애플리케이션을 쉽게 구현할 수 있으며, Spring의 의존성 주입과 같은 기능을 활용할 수 있습니다.
  • 유연한 설정 (Flexible Configuration):

    • Spring Cloud Stream은 YAML 또는 properties 파일을 통해 다양한 설정 옵션을 제공합니다.
    • 바인더의 종류, 메시지 포맷, 재시도 로직 등 다양한 요소를 손쉽게 커스터마이징할 수 있습니다.

2.3 Spring Cloud Stream을 이용한 애플리케이션 개발

Spring Cloud Stream을 이용하여 이벤트 드리븐 애플리케이션을 개발하는 과정은 다음과 같습니다:

  1. 바인더 설정: 사용하고자 하는 메시지 브로커(Kafka, RabbitMQ 등)에 맞는 바인더를 설정합니다.

  2. 프로듀서 생성: 애플리케이션에서 이벤트를 발생시키는 프로듀서를 생성합니다. 예를 들어, 주문이 생성될 때 '주문 생성' 이벤트를 발생시킵니다.

  3. 컨슈머 생성: 이벤트를 수신하여 처리할 컨슈머를 생성합니다. 예를 들어, '주문 생성' 이벤트를 수신하여 재고를 업데이트하는 로직을 구현합니다.

  4. 애플리케이션 배포: 설정한 바인더와 함께 애플리케이션을 배포합니다. 애플리케이션은 메시지 브로커와 연결되어 이벤트를 주고받으며 동작합니다.

이와 같이 Spring Cloud Stream을 이용하면 복잡한 메시지 브로커와의 통합 과정을 단순화할 수 있으며, 이벤트 기반 애플리케이션을 보다 쉽게 구축할 수 있습니다.

0개의 댓글