책/도메인 주도 설계 첫걸음
커뮤니케이션 패턴
ballde
2023. 2. 28. 10:14
모델 변환
커뮤니케이션 하기 위한 다양한 설계 패턴이 있다.
스테이트리스 모델 변환
프록시가 동기식 통신인지 비동기식 통신인지에 따라 다르다.
동기
- 코드베이스에 변환 로직을 포함하는 것
- 오픈 호스트 - 유입되는 요청을 처리할 때 발생
- 충돌 방지 계층 - 업스트림 바운디드 컨텍스트를 호출할 때 발생
- API 게이트웨이 패턴과 같은 외부 컴포넌트로 넘기는 것이 효과적일 수도 있다.
비동기
- 메세지 프록시를 구현할 수 있다.(메세지 구독하는 중개 컴포넌트)
- 메세지 모델을 변환하는 것 외에도 메세지를 필터링하여 노이즈를 줄일 수 있음
- 오픈 호스트 서비스를 구현할 때 비동기식 모델 변환은 반드시 필요
- 비동기 변환을 사용하면 도메인 이벤트를 가로채서 공표된 언어로 변환할 수 있음 ⇒ 캡슐화 잘됨
스테이트풀 모델 변환
- 원천 데이터를 집계하거나 여러 개의 요청에서 들어오는 데이터를 단일 모델로 통합해야하는 변환 매커니즘
일괄처리
- 들어오는 데이터를 추적하고 처리하기위해선 영구 저장소가 필요하다.
- 스트림처리 플랫폼(kafka, aws kinesis), 일괄 처리 솔루션(spark 등)
여러 요청 통합
- 여러 요청에서 집계된 데이터 처리(프론트에서 많은 요청이 올때)
- 충돌 방지 계층을 전면에 배치하여 로직의 복잡성을 분리하는것이 좋을 수 있다.
에그리게이트 연동
- 시스템 나머지 부분과 통신하는 방법 - 도메인 이벤트 발행
예시
- 애그리게이트의 도메인 이벤트 추가 후 발행
문제점
- db커밋 전에 이벤트가 전달됨
- 즉 구독자는 캠페인이 비활성화되었다는 알림을 받았지만 실제 캠페인 상태와 모순된다.
- 어떤한 일이 벌어져서 트랜잭션이 커밋되지 않는다면?
- 애그리게이트 관련 인스턴스 로드 → 비활성화 → db 커밋 → 도메인 이벤트 발행
문제점
- 어떠한 이유로 도메인 이벤트를 발행하지 못할 수도 있다.
아웃박스
- 두개의 테이블에 원자적으로 커밋하고 메세지를 저장하기 위한 전용 테이블을 사용하는 것이 좋다.
- db 커밋은 따로, 메세지 릴레이에서 아웃박스 테이블을 보고 발행해라? 이뜻인가?
- 메세지 릴레이는 pull(폴링), push(트랜잭션 로그 추적) 기반으로 이벤트 가져옴
- 아웃박스 패턴은 적어도 한번은 메세지 배달을 보장한다
사가
- 각 트랜잭션을 애그리게이트의 단일 인스턴스로 제한한다.
- 그러나 여러 애그리게이트에 걸쳐 있는 프로세스를 구현해야할 수도 있다.
- 광고 캠페인 활성화 → 퍼블리셔에 제출 → 발행상태 변경(발행, 거부)
- 여러 트랜잭션에 걸쳐있는 비즈니스 프로세스
- 실행단계중 실패하면 시스템 상태를 일관되게 유지하도록 조치
- 메세징 인프라에 의존하여 관련 이벤트를 전달하고 관련 커멘드를 실행하여 이벤트에 반응
- 상태 관리가 필요없다.
- 실행된 작업을 추적하여 실패시 보상조치 ⇒ 상태 관리가 필요하다.
- 컴포넌트의 상태는 궁극적으로 일관성을 갖는다.
- 사가는 이벤트를 해당 커맨드와 일치시킨다.
프로세스 관리자
- 비즈니스 로직 기반 프로세스를 구현하기 위한 것이다.
- 여러 단계로 구성된 응집된 비즈니스 프로세스이다.
- 경로, 예약 등 다 완료되고 프로세스 관리자가 상태를 변경(?? 이해한게 맞나??)
결론
- 시스템 컴포넌트를 연동하기 위한 다양한 패턴을 배웠다.