EDA(Event-Driven Architecture)
이벤트 기반 아키텍처는 비동기식 메시지를 사용하여 상태변경을 표현하는 이벤트로 통신한다. 때문에 서비스가 높은 수준으로 분리되고 상태변경을 빠르게 적용할 수 있다.
메시징이 필요한 이유
- 서비스 간 호출 부하 최소화
- 데이터 엑세스 비용 절감
- 각 서비스 간의 DB에 직접 접속을 최소화하기 위해 캐싱이나 동기화를 적용한다.
- 이때, 캐싱을 위한 데이터는 일관성이 있어야 하며
- 동기화를 위해서는 상태 변화를 인식해야 한다.
상태변화 전달하기
- 동기 방식으로 상태변화 전달(Redis)
- 레디스는 분산 키-값 저장소 데이터베이스로 캐싱을 위해 사용된다.
- 캐싱 프로세스
- 원본 서비스에 요청하기 전 레디스 캐시 데이터를 확인
- 캐시가 없는 경우 원본 서비스에 직접 요청하여 데이터 조회
- 레디스 캐시에 저장
- 원본 서비스 상태변화 시 레디스 캐시 무효화(참조 서비스 호출)
- 단점
- 원본 서비스와 강결합 및 비유연성
- 메시징 방식으로 상태변화 전달
- 프로세스
- 원본 서비스 데이터를 레디스 캐시에서 조회한다.
- 원본 데이터 상태변화는 실시간으로 발행/소비되어 레디스 캐시에 갱신된다.
- 장점
- 느슨한 결합, 내구성, 확장성, 유연성
- 단점
- 메시지 처리 의미(발행과 소비의 동작방식에 대해 이해 필요)
- 구현의 복잡성
- 가시성
- 프로세스
스프링 클라우드 스트림
이 프로젝트는 애플리케이션의 메시지 발행자와 소비자를 쉽게 구축할 수 있는 어노테이션 기반 프레임워크이다. 여러 메시지 플랫폼(RabbitMQ, Kafka)과 함께 사용할 수 있다.
스트림 컴포넌트
- 소스: 스프링에서 메시지를 발행하는 코드
- 채널: 메시지를 발행하는 영역
- 바인더: 메시지 시스템과 통신
- 싱크: 스프링에서 채널을 수신 대기하고 메시지를 처리하는 코드
구현하기
- 카프카, 레디스 구성
- docker-compose.xml 파일에 추가 설정
- 원본 서비스에 메시지 생산자 구성
- 의존성 추가
- 부트스트랩 클레스에 @EnableBinding(Source.class) 설정
- 원본 서비스에서 메시지 발행 로직 구현
- 스프링 클라우드 Source 인터페이스 주입
- output() 메서드로 하나의 채널에서 메시지 발행
- send()
- 참조 서비스에 메시지 소비자 구성
- 의존성 추가
- 부트스트랩 클레스에 @EnableBinding(Sink.class) 설정
- 채널에서 메시지 받을 때 마다 실행할 메서드 정의
(예제)분산캐싱하기
- 참조 서비스에 레디스 서버 커넥션 설정
- 의존성(jedis) 설정
- 부트스트랩 클래스에 DB 커넥션(jedis) 및 RedisTemplate 설정
- …