실무에 바로 쓰는 DDD기반으로 유연성과 확정성 있게 MSA 설계하기
분산 추적(Sleuth, Zipkin)
분산 추적(Sleuth, Zipkin)
- 분산 추적(Sleuth, Zipkin)
분산 추적(Distributed Tracing)이란?
MSA 환경에서는 하나의 요청이 여러 서비스를 거쳐 처리된다.
예를 들어 사용자가 주문 조회 API를 호출하면 다음과 같은 흐름이 발생할 수 있다.
Client
↓
Gateway Service
↓
Order Service
↓
Menu Service
↓
Database
모놀리식 환경에서는 하나의 애플리케이션 로그만 확인하면 되지만, MSA 환경에서는 요청이 여러 서비스를 거치므로 문제가 발생했을 때 추적이 매우 어려워진다.
예를 들어:
- 응답 속도가 느림
- 특정 서비스에서 오류 발생
- 일부 요청만 실패
와 같은 상황에서
Gateway 로그
Order 로그
Menu 로그
DB 로그
를 각각 확인해야 한다.
이 문제를 해결하기 위해 사용하는 것이 바로 분산 추적(Distributed Tracing) 이다.
분산 추적이 필요한 이유
다음과 같은 서비스 호출 구조를 생각해보자.
flowchart LR
Client --> Gateway
Gateway --> Order
Order --> Menu
Menu --> DB[(Database)]
사용자가 주문 조회를 요청했는데 응답 시간이 5초가 걸렸다고 가정해보자.
문제는:
- Gateway가 느린 것인지
- Order Service가 느린 것인지
- Menu Service가 느린 것인지
- DB가 느린 것인지
판단하기 어렵다는 것이다.
즉,
하나의 요청이 여러 서비스를 거치는 흐름 자체를 추적할 수 있어야 한다.
Spring Cloud Sleuth란?
Spring Cloud Sleuth는 분산 추적을 위한 라이브러리이다.
주요 역할은 다음과 같다.
- Trace ID 생성
- Span ID 생성
- 서비스 간 Trace 전달
- 로그 자동 연동
즉,
하나의 요청이 여러 서비스를 거치더라도
동일한 Trace ID
를 유지하여 요청 흐름을 추적할 수 있게 해준다.
Zipkin이란?
Zipkin은 분산 추적 데이터를 수집하고 시각화하는 시스템이다.
Sleuth가 생성한:
- Trace ID
- Span ID
- 요청 시간
- 응답 시간
등을 수집하여 UI로 보여준다.
즉:
- Sleuth → 추적 데이터 생성
- Zipkin → 추적 데이터 저장 및 시각화
역할을 수행한다.
Sleuth + Zipkin 구조
flowchart LR
Gateway[Gateway Service]
Order[Order Service]
Menu[Menu Service]
Zipkin[Zipkin Server]
Gateway --> Order
Order --> Menu
Gateway --> Zipkin
Order --> Zipkin
Menu --> Zipkin
각 서비스는 추적 데이터를 Zipkin으로 전송한다.
Trace와 Span
분산 추적을 이해하려면 Trace와 Span 개념을 알아야 한다.
Trace
사용자 요청 전체를 의미한다.
예시:
사용자 주문 조회 요청
Span
서비스 하나의 작업 단위를 의미한다.
예시:
Gateway 처리
Order Service 처리
Menu Service 처리
Trace 구조
flowchart TD
Trace[Trace ID]
Span1[Gateway Span]
Span2[Order Span]
Span3[Menu Span]
Trace --> Span1
Span1 --> Span2
Span2 --> Span3
하나의 Trace 안에 여러 Span이 포함된다.
의존성 추가
Spring Cloud Sleuth
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
Trace와 Span을 자동 생성한다.
Spring Cloud Zipkin
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
Zipkin 서버로 추적 데이터를 전송한다.
application.yml 설정
sleuth:
sampler:
probability: 1.0
zipkin:
base-url: http://localhost:9411
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%X{traceId},%X{spanId}]"
설정을 통해:
- Trace 생성
- Zipkin 전송
- 로그 연동
이 가능해진다.
sampler.probability
probability: 1.0
의미:
100% 추적
모든 요청을 Trace 대상으로 수집한다.
운영 환경에서는 일반적으로:
probability: 0.1
처럼 일부 요청만 수집하기도 한다.
로그에 Trace 정보 추가
Sleuth를 적용하면 로그에 Trace ID와 Span ID가 자동 포함된다.
예시:
2025-01-01 12:00:00
[6f8a4c1f92d1a23b, 4f9d3c21b1aa7f12]
OrderService Started
여기서:
6f8a4c1f92d1a23b
는 Trace ID
4f9d3c21b1aa7f12
는 Span ID이다.
Zipkin 실행
Docker를 이용하면 쉽게 실행할 수 있다.
docker run -d -p 9411:9411 openzipkin/zipkin
기본 접속 주소:
http://localhost:9411
요청 흐름 추적 과정
sequenceDiagram
participant Client
participant Gateway
participant Order
participant Menu
participant Zipkin
Client->>Gateway: 요청
Gateway->>Order: Trace ID 전달
Order->>Menu: Trace ID 전달
Gateway->>Zipkin: Span 전송
Order->>Zipkin: Span 전송
Menu->>Zipkin: Span 전송
Zipkin에서 확인 가능한 정보
Zipkin에서는 다음 정보를 확인할 수 있다.
Trace ID
하나의 요청 식별
Span ID
서비스 작업 단위 식별
Duration
서비스 처리 시간
Service Name
어떤 서비스가 처리했는지 확인
호출 순서
서비스 간 호출 흐름 확인
Zipkin 화면 예시
Zipkin에서는 다음과 같은 형태로 요청 흐름을 확인할 수 있다.
gateway-service
↓
order-service
↓
menu-service
그리고 각 서비스의 처리 시간도 확인할 수 있다.
예시:
gateway-service : 182ms
order-service : 120ms
menu-service : 60ms
장애 분석 예시
사용자 요청이 느릴 경우:
Zipkin을 보면
Gateway : 30ms
Order : 50ms
Menu : 3500ms
처럼 확인할 수 있다.
즉,
Menu Service가 병목 지점이라는 사실을 빠르게 파악할 수 있다.
ELK와 Zipkin의 차이
많이 헷갈리는 부분 중 하나이다.
ELK
목적
로그 분석
확인 내용
에러 로그
예외 발생
사용자 행동
Zipkin
목적
서비스 호출 추적
확인 내용
서비스 호출 흐름
응답 시간
병목 구간
Prometheus와 Zipkin 차이
Prometheus
확인 대상
메트릭
예시
CPU
Memory
Request Count
Zipkin
확인 대상
Trace
예시
서비스 호출 흐름
응답 시간
Span
Observability 관점에서의 위치
최근 MSA 환경에서는 다음 세 가지를 함께 구성한다.
flowchart LR
Logs[Logs]
Metrics[Metrics]
Traces[Traces]
ELK[ELK Stack]
Prometheus[Prometheus]
Zipkin[Zipkin]
Logs --> ELK
Metrics --> Prometheus
Traces --> Zipkin
Logging
ELK
Metrics
Prometheus + Grafana
Tracing
Sleuth + Zipkin
정리
분산 추적은 MSA 환경에서 하나의 요청이 여러 서비스를 거치는 흐름을 추적하기 위한 기술이다.
Spring Cloud Sleuth는 Trace ID와 Span ID를 생성하고 서비스 간 전달하며, Zipkin은 이를 수집하고 시각화하여 서비스 호출 흐름과 병목 지점을 쉽게 분석할 수 있도록 도와준다.
한 줄 요약
Spring Cloud Sleuth와 Zipkin은 MSA 환경에서 요청의 Trace ID와 Span 정보를 기반으로 서비스 간 호출 흐름을 추적하고 시각화하여 장애 원인 분석과 성능 병목 구간 파악을 가능하게 해주는 분산 추적 시스템이다.