Building EDM - 1. 기초

roon-replica·2022년 8월 14일
0

architecture

목록 보기
3/3
  • 참고 자료: Building Event Driven Mircorservices(애덤 벨메어, 한빛미디어)

개요

  • EDM은 특정한 경계 컨텍스트를 구현하기 위해 개발한 작은 애플리케이션이라고 함.

  • consumer microservice

    • 입력 이벤트 스트림으로부터 이벤트를 소비/처리
  • producer microservice

    • 이벤트 스트림에 이벤트를 생산
  • 이벤트 브로커는 이벤트 스트림을 제공한다고 함..

  • EDM은 이벤트 브로커에 이벤트를 생산/소비하는 공통 기능을 공유하며 비동기로 통신하다고 함...

토폴로지

마이크로서비스 토폴로지

  • 마이크로서비스가 이벤트를 받아들이고, 처리, 출력하는 구성을 의미

  • 변환, 저장, 방출등을 data driven operation이라고 함..

비즈니스 토폴로지

  • 비즈니스 로직을 처리하는 (마이크로서비스, 이벤트 스트림, API)의 집합이라고 함
    즉, 서비스 사이의 관계에 대한 토폴로지

이벤트의 내용

  • 비즈니스와 관련된 모든 것은 이벤트가 될 수 있다고 함..
  • 이벤트는 발생한 사건의 recording이라고 함..
    로그와의 차이는 이벤트는 single source of truth라고 함.

이벤트 구조

  • 이벤트는 주로 (key,value) 형식으로 표현한다고 함

unkeyed event

  • 하나의 사실을 진술한 형태로 나타낸 이벤트?
    예) 고객이 상품을 클릭했다는 사실을 이벤트로 표현할 수 있다고 함...
    key,value 쌍이 (-, 상품 번호)로 키가 없는 이벤트로 표현할 수 있다고 함.

entity event

  • entity는 식별자가 있는 유일한 것
  • entity 이벤트는 어느 시점의 엔티티 상태값들을 기술한다고 함
    예) (상품 id, 상품)

keyed event

  • key가 있는 이벤트이지만 entity를 나타내는건 아닌 이벤트라고 함..
    예) (상품 id, 상품 스트림?)

  • entity event가 특정 시점의 엔티티 상태라면 keyed event는 여러 시점에서의 엔티티 상태들을 value로 가진다고 보면 되나..?

table stream duality

  • 엔티티 이벤트 스트림에서 흘러온 엔티티 이벤트를 순서대로 적용하면 stateful table(상태 저장 테이블)을 구체화할 수 있다..??

  • 테이블-스트림 이원성..?(table stream duality)
    이벤트들이 upsert되어 상태 테이블을 이루거나, 반대로 각 업데이트들을 이벤트 스트림에 발행하여 테이블을 엔티티 이벤트의 스트림으로 바꿀 수도 있다는 것을 의미..

  • 붙임 전용(append only) 파일?
    mysql binlog가 예시라는데, binlog는 모든 데이터 변경에 대한 로그임.
    docs / mysql binary log overview
    append only라는게 replication 위한 거고, 현재 존재하는 데이터를 변경없이 그대로 append하게 해주는 속성을 말하는듯.
    그래서 붙임 전용 불변 로그라고도 부르는 듯

  • 키 있는 이벤트는 툼스톤 이벤트(값이 null인데 key는 있는 이벤트)로 삭제한다고 함...

  • 붙임 전용 불변 로그는 compaction이 필요하다고 함..
    compaction은 이벤트 브로커가 내부 로그 크기를 줄이려고 key별로 가장 최근 이벤트 하나만 보관하는 거라고 함..
    (compaction도 tradeoff가 있음을 추측 가능.)

이벤트 데이터 스키마

  • consumer가 producer에게 따로 물어보지 않고 이벤트 컨텐츠와 의미를 해석할 수 있다면 이상적이라고 함..
    구글 프로토콜 버퍼같은 스키마 기술..?이 EDM에서 많인 쓰이는 2가지 기능을 제공한다는데...
    스키마 변경, 스키마화한 데이터를 객체로 변환하는 부분을 도와준다고 함...

이벤트 브로커

  • 이벤트 브로커의 역할은 이벤트를 받아서 queue 또는 이벤트 스트림에 저장하고, 다른 프로세스가 이것을 소비할 수 있도록 제공하는거라고 함..

  • scalability, durability, high availability, high performance 특징이 필요하다고 함.

  • 이벤트 보관과 처리에 관련된 여러 요건들이 있음..
    근데 하나도 안 와 닿아서 일단 스킵

추가 고려 사항

이것도 안 와닿아서 일단 스킵

이벤트 브로커 vs 메세지 브로커

  • 이벤트 브로커는 메세지 브로커 대신 쓸 수 있지만,
    메세지 브로커는 이벤트 브로커 기능을 완전히 대체할 수 없다고 함...

  • 메세지 브로커
    발행/구독 메세지 큐를 이용.
    producer가 큐에 메세지를 쓰면 consumer는 메세지를 받아 소비하고 ACK를 보냄.
    ACK 신호가 확인되면 메세지는 삭제됨

  • 이벤트 브로커
    순서대로 쌓은 로그를 제공할 목적으로 설계되었다고 함.
    메세지 브로커와 달리 여러 컨슈머가 이벤트에 마음껏 접근 가능하다고 함.
    파티션된 이벤트 스트림이라는거 때문에 가능한듯.
    (메세지 브로커는 큐 단위로만 처리되어 한 이벤트는 한 컨슈머만 소비가능하다고 함)

    그리고 이벤트 브로커에서는 이벤트를 소비해도 이벤트가 보존됨.

  • 컨슈머는 이벤트 스트림이나 큐로 이벤트를 소비한다고 함..

  • 이벤트 브로커는 서비스가 데이터를 생산,소비하는 유일한 장소가 된다고 함..

  • 이벤트 브로커가 single source of truth이 되면, 개발이 편해진다고 함..

대규모 마이크로서비스 관리

  • 마이크로서비스는 수가 많아지면 관리하기 어려워진다고 함

  • 마이크로서비스를 소유한 팀별로 관리/배포할 수 있어야 한다고 함

  • 도커같은 컨테이너 기술로 애플리케이션 격리시키고, 쿠버네티스 같은 컨테이너 관리 소프트웨어로 관리하면 됨.

비용

  • 비용문제도 사소한 문제가 아니라고 함

의문점

  • 경계 컨텍스트 개념이 그리 와닿지 않음

  • 이벤트를 소비한다는게 구체적으로 어떤 동작을 하는건지 모름

  • 이벤트 스트림에 이벤트를 생산한다는게 어떤 동작을 하는건지 모름

  • 이벤트 브로커가 어떻게 생겼는지 모름

  • keyed event는 이벤트 스트림의 한 파티션 내에서 data locality를 보장하기 위해 이벤트 스트림을 파티셔닝하는 용도로 쓰인다는데.. 무슨 말인지 모름

  • table stream duality에서 테이블을 이벤트 스트림으로 만든다는게,
    구체적으로는 SQL 쿼리들 모아놓은걸 이벤트 스트림으로 만드는거 아님?

  • 구글 프로토콜 버퍼가 뭐하는 것이고, 왜 쓰는지 모름

  • 컨슈머가 이벤트를 소비하는 방법(이벤트 스트림 또는 큐) 이해 안 됨

profile
집중 ➝ 프로세서↑ 시간 투자 ➝ 디스크↑

0개의 댓글