이벤트
시스템간 강결합 문제
트렌젝션 처리 애매함
성능이 외부 서비스에 직접적인 영향
A와 B가 강하게 결합되에 있어 서로 영향을 받음.
- 해결법
- 이벤트
- 비동기
이벤트 개요
이벤트란?
이벤트 : 과거에 벌어진 어떤 것
구성요소
이벤트 생성 주체, 디스패처, 핸들러
핸들러는 이벤트에 반응해서 원하는 기능을 실행
용도
- 트리거
- 도메인의 상태가 바뀔때 후처리가 필요하면 실행하기 위한 트리거
- 데이터 동기화
- 외부 서비스의 정보를 동기화
이벤트,핸들러,디스패처 구현
이벤트 클래스
이름을 과거시제로 사용
최소한의 데이터를 포함
디스패처 (퍼블리셔)
스피링이 제공하는 ApplicationEventPublisher사용
이벤트 핸들러
@EventListener를 사용해서 구현
동기 이벤트 처리문제
강결합 문제는 해소 but 외부서비스 영향 해결X
비동기 이벤트 처리하기
- 로컬 핸들러를 비동기로
- 메세지 큐를 사용
- 저장소와 포워더 사용
- 저장소와 api사용하기
로컬 핸들러
별도 스레드로 실행
@Async 어노테이션 사용(메서드) @EnableAsync 어노테이션으로 비동기를 활성화(클래스)
메시징 시스템
Kafka나 RabbitMQ 사용
디스패쳐가 메시지 큐애 이벤트를 보냄
메시지 큐에서 처리
이벤트 저장소
일단 db에 저장한뒤에 별도 프로그램을 이요해서 전달
API방식도 같음
고려사항
이벤트 소스를 EventEntry에 추가할지 여부 (누가 발생했는지?)
전송 실패 횟수
트렌젝션 고려
트렌젝션이 성공했을때만 리스너 실행하면 됨
'Java' 카테고리의 다른 글
DDD CQRS (0) | 2023.06.07 |
---|---|
DDD 도메인 모델과 바운디드 컨텍스트 (0) | 2023.06.03 |
DDD 애그리거트 트랜젝션 관리 (0) | 2023.06.03 |
DDD 도메인 서비스 (0) | 2023.06.03 |
DDD 응용서비스와 표현 영역 (0) | 2023.06.03 |