개발 관련 일지/세미나

[우아한테크세미나] Kafka 이벤트 기반 아키텍처 구축

worldi 2024. 1. 9. 00:19

2024.01.08 시청

발단 : 이벤트 기반 아키텍처 왜 사용?

배달 시스템의 복잡도 증가

  • 알림 기능
  • 배달 시간
  • 통계
  • 배달 늦었을 때 쿠폰 기능

배달만 잘 수행하길 바랬지만 요구 사항이 늘어날 수록 복잡도가 커진다.

따라서 해결법으로는 시스템을 분리하자! 이다. 대부분의 기능은 배달과 강한 일관성을 필요로 하지 않는다.

즉, 배달이 변경되었을 때, 관련 기능도 동시에 반영되어야 하는 가가 강한 일관성의 기준이 된다. 통계나, 쿠폰과 같은 개념은 관련 기능이 “언젠가” 반영되면 된다. (= 결과적 일관성)

결과적 일관성

  • 관련 기능이 언젠가 반영되면 된다.
  • 이벤트는 시스템에서 일어난 행위이다.
  • 해결법 → 이벤트 아키텍처를 이용하자!

이벤트 아키텍처 구현법

이벤트는 어떤 정보를 가지고 있어야 할까?

이벤트 구성 요소

  • 이벤트의 정의
    • 마틴 파울러에 따르면, 이벤트는 “도메인에 영향을 주는 관심 정보” 라고 말한다.
  • 대상, 행동, 정보, 시간으로 이루어져 있다.

대상

  • 대상의 식별자 정보를 제공

행위

  • 이미 벌어진 사건으로 과거형으로 표현

행위를 표현하는 방법

  • 행위와 관련된 값

시간

  • 행위가 발생한 시간

ex) 배달 (대상)이 A라이더에게 (행위 관련 값) 11시에(시간) 배차되었다.(행위) 로 나눌 수 있다.

다음은 실제 이벤트를 데이터화 한 예시 이다.

 

이벤트 아키텍처 적용 후

  • 배달 시스템 복잡도 영향이 없다.
    • 이는, 요구사항이 추가될 때도 마찬가지이다.
  • 데이터 분석 측면에서도 좋다.
  • 이벤트를 통해 소비처에게 정보 전달할 수 있다. (풍부한 정보의 이벤트 일 경우)

이벤트 아키텍처 사용 시 주의점

  • 이벤트 데이터 무분별한 추가 주의!
    • 소비처와 발행처 간의 결합도가 올라간다.
    • 행위자 기반의 데이터 전달 필요
  • 이벤트의 순서가 중요하다.
    • 주문 취소 이후 주문 생성 이벤트가 들어왔다?
      • 주문 취소 되면 배달 생성이 안된다.
      • 이벤트 순서를 보장하고자 어떻게 했을까? → 이벤트 파이프 라인

이벤트 파이프 라인

  • SNS, SQS, Kafka 등 다양하다.

카프카를 선택한 이유

순서 보장, 고성능, 고가용성, 통합 도구, 전담팀 지원 등이 있다.

순서 보장

토픽의 파티션을 통해 key별로 순서 보장한다.

고성능, 고가용성

실시간 이벤트를 처리한 고성능 고가용성 제공

통합 도구

Kafka Streams, Kafka Connect 등 다양한 통합 도구 제공

전담팀 지원

카프카 클러스터 관리, 모니터링 지원도구 제공

카프카 사용할 때 문제점

  • 이벤트 발행이 실패하거나, 재시도 처리가 발생 시, 이벤트 순서가 변경이 되는 문제점이 있다. → 이는 결국 도메인의 상태와 이벤트 발행 결과가 불일치하게 되었고, 시스템 장애로 이어진다.

해결 방법 : Transactional OutBox Pattern 을 사용한다.

이는, 데이터 베이스 트랜잭션을 활용하여 이벤트를 아웃박스 테이블에 적재하고, 이후에 메세지 릴레이가 이벤트 발행을 보장해주는 기법이다.

  1. 발행해야할 이벤트를 도메인 처리 트랜잭션과 묶어 아웃 박스 테이블에 저장한다.
    1. 이를 통해 도메인의 상태와 발행해야 될 이벤트 간의 일관성을 보장해준다.
  2. 메세지 릴레이가 아웃박스 테이블의 저장된 이벤트을 순서대로 읽어 발행함으로써 이벤트의 순서와 발행을 보장한다.

메세지 릴레이 구현

  • 고려할 점 : 저비용, 안전성, 처리량
  • 오픈 소스 플랫폼에서 제공하는 Debezium 을 선택
  • 처리량을 높이기 위해 (한계가 있었음 테스크 수를 한개로만 지정해야하는) 아웃박스 테이블을 파티셔닝 처리한다. 프로듀서가 이벤트 키 기반으로 이벤트 파티셔닝한다. 적절한 아웃박스 테이블에 적재한다.

활용 사례

  • 순서가 보장된 이벤트는 이벤트 스트림을 구성한다.
  • 이벤트 스트림으로 CQRS 를 적용할 수 있다.
    • 조회 기능을 이벤트 기반으로 바꾼다. → 쿼리쪽에 문제 발행해도 커맨드 쪽에 장애 가지 않도록
  • 이벤트 스트림으로 데이터 분석 환경 구축
  • 이벤트 스트림으로 스트림즈 애플리케이션 구현

출처

https://www.youtube.com/watch?v=DY3sUeGu74M