학습일지/이벤트 기반 마이크로서비스
[이벤트 기반 마이크로서비스] 이벤트와 브로커 특징
Merge Log
2025. 9. 24. 17:40
이벤트
- 발생한 사건의 기록물
- 애플리케이션 프로그램에서 벌어지는 모든 일이 로그에 기록되는 것과 비슷하다
- 단 이벤트는 로그와 달리 기록물이면서 단일 진실 공급원이라는 차이점이 있다
이벤트 구조
- 이벤트는 보통 키/값 포맷으로 표현
- 이벤트의 전체 세부 정보는 값에 보관하고, 키는 식별/라우팅/같은 키를 가진 이벤트를 집계 하는 작업에 사용
- 이벤트 종류에 상관없이 키는 필수 필드가 아니다
키 없는 이벤트(unkeyed event)
- 하나의 사실을 진술한 형태로 나타낸 이벤트
- 고객이 어떤 도서와 상호작용 했다는 사실을 나타내는 이벤트 등에서 사용
key: null
value: ISBN/37884, Timestamp: 152349234
엔티티 이벤트
- 엔티티는 유일한 것으로 유일한 ID가 키로 부여된다
- 어느 시점의 엔티티 속성 및 상태를 기술한다
- 엔티티 상태의 연속된 이력을 제공하고 상태를 구체화하는 용도로 사용
- 엔티티의 현재 상태는 마지막 엔티티 이벤트만 있어도 알 수 있다
key: ISBN/37884
value: Author/Adam
키 있는 이벤트(keyed event)
- 키를 포함하지만 엔티티를 나타내지는 않는다
- 주로 이벤트 스트림의 한 파티션 내에서 데이터 지역설을 보장하기 위해 이벤트 스트림을 파티셔닝하는 용도로 쓰임
- 이벤트를 특정 기준으로 파티셔닝했을때 해당 키를 가지고 파티셔닝한다
key: ISBN/37884
value: UserId/1
key: key: ISBN/37884
value: UserId/100
엔티티 이벤트에서 상태를 구체화
- 엔티티 이벤트 스트림에서 흘러온 엔티티 이벤트를 순서대로 적용하면 상태 저장 테이블을 구체화할 수 있다
- 각 엔티티 이벤트는 영속화되므로 키 별로 가장 최근에 읽은 이벤트를 알 수 있다
- 반대로 각 업데이트를 이벤트 스트림에 발행하여 테이블을 엔티티 이벤트의 스트림으로 바꿀 수도 있다
- 이를 테이블-스트림 이원성이라고 한다
- 키 있는 이벤트는 툼스톤 이벤트(tombstone) 를 만들어 삭제한다
- 값을 null로 설정한 키 있는 이벤트
- 이는 업스트림(upstream) 프로듀서가 어떤 키를 가진 이벤트가 삭제 대상이라고 선언했으니 그 사실을 다운스트림(downstream) 컨슈머에게 알려주는 일종의 이벤트 관례
- 업스트림 : 내가 소비하는 데이터의 곱급원
- 다운 스트림 : 발행한 메시지를 소비하는 쪽
- 이벤트 로그는 대부분 append-only, immutable log 형태로 기록하며 이에 따라 compaction(압착)을 하지 않으면 무한정 커질 수 있다
- 컴팩션은 이벤트 브로커가 내부 로그 크기를 줄이고자 키별로 가장 최근 이벤트 하나만 보관하는 작업
- 소비에 대한 오프셋은 그대로 유지해야함
- 이에 따라 이벤트 스트림에 쌓인 이벤트 이력은 포기할 수밖에 없지만 디스크 사용량을 줄일 수 있다
테이블-스트림 이원성(Table-Stream Duality)
- 스트림과 테이블은 서로 다른 것처럼 보이지만 사실 서로 변환 가능하고 동일한 데이터를 보는 두 가지 관점이다
- 스트림(Stream) : 시간이 흐르면서 끝없이 추가되는 이벤트들의 순차적 기록(log)
- 테이블(Table) : 어떤 시점에 존재하는 데이터의 현재 상태(snapshot)
- 이를 통해 가져올 수 있는 장점은 서로 직접 결합하지 않아도 상태를 공유할 수 있다
이벤트 스트림 단일 작성자 원칙
- 이벤트 스트림은 정확히 하나의 생산 서비스를 가진다
- 해당 이벤트 스트림에 소유자
- 그래서 어떤 이벤트라도 시스템을 흘러가는 데이터를 계속 따라가면 그 이벤트의 진실 공급원을 파악할 수 있다
이벤트 브로그 vs 메시지 브로커
- 이벤트 브로커는 메시지 브로커 대신 사용할 수 있지만, 메시지 브로커는 이벤트 브로커의 기능을 완전히 대체할 수 없습니다
- 메시지 브로커는 발행/구독 메시지 큐를 통해 통신을 할 수 있으며 프로듀서가 큐에 메시지를 쓰면 컨슈머는 메시지를 받아 처리하고 ACK 처리되면 즉시 또는 짧은 시간 내에 삭제되는 구조이다
- 메시지 브로커는 이벤트 브로커와 다른 종류의 문제를 처리하고자 설계되었다
- 이벤트 브로커는 순서대로 쌓은 사실 로그를 제공할 목적으로 설계되었다
- 둘의 차이점은 먼저 컨슈머의 오프셋을 통한 소비가 있다
- 만약 컨슈머 그룹이 여러개 일때 메시지 브로커라면 각 컨슈머는 모든 이벤트를 얻을 수 없고 이벤트 브로커는 독립적으로 여러 컨슈머가 각자 필요한 이벤트를 소비할 수 있다
- 두번째로는 메시지 영속화이다
- 메시지 브로커는 소비 직후 이벤트를 삭제하므로 재연 가능한 단일 진실 공급원을 제공할 수 없다
- 이벤트 브로커는 이벤트를 삭제하지 않으며 특정 위치부터 메시지를 소비해서 재처리할 수 있다