Post

04 데이터 정합성 - Event-Driven Architecture

04 데이터 정합성 - Event-Driven Architecture

1. Note

  • 추상화 + 스프링이랑 비슷한 느낌으로 바라봐야할듯
    • 명시되거나 보이지는 않지만, 큰 시스템내에서 뭔가 각기 역할이 존재하고 있고
    • 그 틀들을 구성해주면, 시스템별로 알아서 그것들을 작동하는 구조.
  • A,B,C 서비스가 순서대로 흐를때
    • A,B,C는 서로의 존재와 역할을 모름,
    • 그냥 단지 누군가 입력해놓은 이벤트가 있다면,
    • 그것을 처리할뿐.

2. Event-Driven Architecture

1. Event-Driven Architecture 개념

  • 서비스 간 통신을 이벤트(Event) 기반으로 처리하는 아키텍처 방식
  • 서비스가 직접 호출하지 않고 이벤트를 발행(Publish)하고, 필요한 서비스가 이를 구독(Subscribe)하여 처리
  • 서비스 간 직접 호출을 줄이고, 이벤트를 통해 느슨하게 연결(Loose Coupling)하는 것
    • 서비스 독립성 향상
    • 확장성 증가
    • 비동기 처리 가능

2. 동기/비동기 구조

  • 기존 동기 호출(Synchronous) 방식
    • 요청을 보낸 서비스가 상대 서비스의 응답을 받을 때까지 기다려야함
    • 각 서비스는 이전 작업이 완료될 때까지 대기해야 하며,
    • 중간 서비스 장애가 전체 흐름에 영향을 줄 수 있음
  • 비동기 구조
    • 서비스 간 결합도 감소 / 이벤트만 발행하고, 그 이후 처리는 이벤트를 구독하는 서비스가 담당
    • 장애 전파 최소화 / 이벤트가 메시지 브로커에 저장, 특정 서비스가 문제가 생겨도 티켓보고 처리함.
    • 응답 속도 향상 / 응답을 기다리는 시간이 줄어 처리속도가 빠름
    • 확장성 향상 / 기존 로직 변경 없이 Consumer만 추가하면 서비스 확장이 가능함.

3. 주요 구성요소

1. 체크 포인트

  • 협력 구조

    1
    2
    3
    4
    5
    6
    7
    
    Producer   # 비즈니스 로직 수행
    ↓
    Event      # 이벤트 생성
    ↓
    Message Broker  # 이벤트 저장 및 전달
    ↓
    Consumer   # 이벤트 구독 후 처리
    
  • Producer / Consumer는 “서비스 기준”이 아니라 “이벤트 기준 역할”
  • 비즈니스로직에 따라
    • 첫 로직은 Producer 역할 확률이 높고
    • 두번째부터는 Consumer / Producer 역할 확률이 높고
    • 마지막은 Consumer 역할 확률이 높음
    • 고정은 아님!

2. Event

  • 시스템 내부에서 발생한 상태 변화 또는 행동 사실

    1
    2
    3
    4
    
    OrderCreated # 주문생성
    PaymentCompleted # 결제완료
    InventoryFailed # 재고 증가/감소 실패
    UserRegistered # 유저등록
    
  • 과거형 느낌(?)으로 표현됨 / 작업 결과 묘사가 가까운 것 같음

    • Request 표현 -> Event 표현
    • 주문을 했으니 결제해줘 -> 주문을 완료 했음 (오더 서비스)
    • 결제 완료했으니 재고 차감해줘 -> 결제 완료 했음

3. Producer

  • 이벤트를 생성(Publish)하는 주체
  • 비즈니스 작업을 먼저 수행하고, 그 결과로 이벤트를 발행

    1
    2
    3
    
    Order Service # 비즈니스 로직을 수행하고
    ↓
    OrderCreated Event # 이벤트를 발행
    
  • 전체 적인 흐름이 하나 있고 그안에서 캡슐화되서 자신의 일만하는 느낌

4. Consumer

  • 이벤트를 구독(Subscribe)하고 처리하는 주체
  • 특정 이벤트 발생 시 반응하여 작업을 수행하는 역할

    1
    2
    3
    4
    5
    
    OrderCreated Event # 이벤트 생성( 프로듀서 )
    ↓
    Payment Service 수신 # Payment Service는 ORderCreated 이벤트 구독 중, 변화확인
    ↓
    결제 처리 #비즈니스 로직 실행
    

5. Message Broker

  • Producer와 Consumer 사이에서 이벤트를 전달하는 중개 시스템
  • 이벤트를 안전하게 저장하고 전달하는 역할

    1
    2
    3
    4
    5
    
    Producer #프로듀서가 이벤트 생성
    ↓
    Message Broker # 메시지 브로커가 저장 / 전달
    ↓
    Consumer # 컨슈머는 소비
    

4. Event-Driven Architecture 특징

1. 비동기(Asynchronous) 처리

  • EDA는 서비스 간 작업을 비동기적으로 처리
  • 응답 대기 시간이 줄어들고 시스템 처리 효율이 향상될 수 있음

    1
    2
    3
    4
    5
    
    OrderCreated Event 발행
    ↓
    즉시 종료 # Order
    ↓
    Payment Service가 별도 처리
    

2. 느슨한 결합 (Loose Coupling)

  • 특정 서비스가 다른 서비스를 직접 의존하지 않음
  • 서비스 변경이나 확장이 다른 서비스에 미치는 영향을 줄일 수 있음

    1
    2
    3
    4
    5
    
    OrderService에서 OrderCreated Event 발행
      
    Payment Service는 
     - OrderService가 아니라 
     - 이벤트를 구독함. 
    

3. 확장성(Scalability)

  • Consumer를 독립적으로 확장하기 쉬움

    1
    2
    3
    4
    5
    6
    
    OrderCreated Event
    ├─ Payment Service # 구독자 1
    ├─ Notification Service # 구독자 2
    └─ Analytics Service # 구독자 3
      
    # 새로운 서비스가 등장하면 추가로 구독하게 하면됨
    

4. 최종 일관성(Eventual Consistency)

  • 즉시 일관성(Strong Consistency)보다 최종 일관성(Eventual Consistency)
  • 흐름

    1
    2
    3
    
    Order 완료       # DB 반영
    Payment 처리 중  # DB 작업중
    Inventory 미처리**** # 작업대기로 데이터가 다름
    

5. 장점과 단점

구분내용
장점서비스 간 결합도가 낮음(Loose Coupling)
비동기 처리 가능
기존 서비스 수정 없이 Consumer 추가 가능하여 확장성 높음
일부 서비스 장애가 전체 시스템 장애로 전파될 가능성 감소
단점이벤트 흐름 파악이 어려움
분산 환경 특성상 디버깅 및 장애 추적 복잡성 증가
즉시 일관성(Strong Consistency) 보장이 어려움
메시지 중복 및 순서 문제 고려 필요

6. Event 기반 전체 흐름

1. 성공 흐름

1
2
3
4
5
6
7
8
9
10
11
  Order Service # Order 컨텍스트
  ↓
  OrderCreated Event # 브로커
  ↓
  Payment Service # Payment 컨텍스트
  ↓
  PaymentCompleted Event # 브로커
  ↓
  Inventory Service # Inventory 컨텍스트
  ↓
  InventoryCompleted Event # 브로커

2. 실패흐름 Choreography

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  Order Service # Order 컨텍스트
  ↓
  OrderCreated Event # 브로커
  ↓
  Payment Service # Payment 컨텍스트
  ↓
  PaymentCompleted Event # 브로커
  ↓
  Inventory Service # Inventory 컨텍스트
  ↓
  InventoryFailed Event # 실패 이벤트 발행
  ↓
  Payment Service # 결제 취소 보상 트랜잭션 ( saga Pattern )
  ↓
  PaymentCanceled Event 발행 # 결제 실패 이벤트 발행
  ↓
  Order Service # 주문 취소 종결
This post is licensed under CC BY 4.0 by the author.