MSA와 같은 분산 시스템에서 서비스 간의 요청 흐름을 추적하고 모니터링하는 방법을 말한다
예)
MSA 환경에서는 하나의 클라이언트 요청이 여러 서비스를 거쳐야 한다.
API Gateway → 인증 서비스 → 주문 서비스 → 결제 서비스 등
문제 발생 시 어느 서비스에서 지연이 발생했는지, 어디서 에러가 발생했는지 추적하기 어렵기 때문에 분산추적을 사용하여 전체 요청의 흐름을 시각화할 수 있다.
시스템에서 발생하는 이벤트(상태 변화나 행동)를 기반으로 동작하는 소프트웨어 설계 스타일을 말한다
이벤트는 비동기적으로 처리되며, 서비스 간의 느슨한 결합을 통해 독립적으로 동작할 수 있게 한다.
3요소로 이벤트 드리븐 아키텍처라는 개념의 큰 그림을 잡을 수 있다.
| EDA 요소 | Kafka 계열 | RabbitMQ 계열 |
|---|---|---|
| 이벤트 소스 | Producer / Outbox Publisher / CDC(Source Connector) | Publisher / Outbox Publisher / CDC |
| 이벤트 버스 | Topic + Partition + Log(브로커) | Exchange + Queue(브로커) |
| 이벤트 핸들러 | Consumer(Consumer Group) | Consumer(Queue Consumer) |
느슨한 결합:
확장성:
"이벤트 발생 → 반응" 형태로 자연스럽게 연결 가능하다비동기 처리:
복잡성 증가:
장애 전파:
Spring Boot 애플리케이션에서 메시지 브로커 (Kafka, RabbitMQ 등)와 쉽게 연결하여 이벤트 드리븐 아키텍처를 구현할 수 있도록 해주는 프레임워크를 말한다
개발자가 @Bean 함수 단위로 메시지 생상/소비 로직만 작성하면, Spring Cloud Stream이 나머지 바인딩, 직렬화, 에러처리, 재시도 로직을 대신 처리한다.
Binder:
브로커별 어댑터 역할을 한다. (Kafka Binder, RabbitMQ Binder)
"내 코드"와 "실제 브로커" 사이 연결을 담당한다.
Destination:
메시지가 오고 가는 논리적 목적지 (토픽/큐 등)
Binding:
애플리케이션 코드(Supplier/Consumer)와 Destination을 연결하는 설정
Message:
payload + headers 구조의 데이터.
Spring Messaging 표준 인터페이스 사용.
추상화:
Kafka, RabbitMQ 등의 구체 브로커에 의존하지 않고 공통 API로 코딩이 가능하다.
생산자/소비자 단순화:
MessageChannel 이나 함수형 프로그래밍 모델(Supplier, Function, Consumer)로 쉽게 정의할 수 있다.
운영 편의성:
바인더 개념을 통해 브로커 종류를 교체할 때 애플리케이션 로직을 거의 수정할 필요 없다.
EDA 구축 용이:
이벤트 기반 서비스 간 통신, CQRS 읽기 모델 갱신, 사가 패턴 등에 바로 활용이 가능하다.