Correlation ID는 분산 시스템이나 마이크로서비스 아키텍처에서 사용되는 개념으로, 하나의 요청(Request)과 그와 관련된 모든 작업을 추적하기 위해 사용하는 고유한 식별자입니다.
✅ Correlation ID의 역할
- 요청과 응답의 흐름을 추적하기 위한 유일한 ID입니다.
- 서비스 간의 여러 요청이 발생할 때, 하나의 작업 단위(트랜잭션)를 식별하고 추적할 수 있습니다.
- 로그나 모니터링 도구에서 하나의 요청에 대한 전체 흐름을 확인할 수 있습니다.
✅ 왜 Correlation ID가 필요할까?
분산 시스템에서의 요청 추적
- 마이크로서비스에서는 하나의 요청이 여러 서비스로 전달되며, 각 서비스가 여러 단계로 작업을 수행합니다.
- Correlation ID를 사용하면 전체 요청 흐름을 추적할 수 있습니다.
디버깅 및 로깅
- 요청이 실패하거나 오류가 발생했을 때, 로그를 쉽게 필터링하고 분석할 수 있습니다.
성능 모니터링
- 요청당 응답 시간을 측정하고 병목 지점을 파악할 수 있습니다.
✅ Correlation ID의 작동 방식
요청 시작
- 클라이언트가 요청을 보내면 서버에서 고유한 Correlation ID를 생성합니다.
- 클라이언트가 이미 Correlation ID를 보냈다면, 이를 사용합니다.
서비스 간 전파
- 생성된 Correlation ID는 HTTP Header나 메시지에 포함되어 다른 서비스로 전파됩니다.
- 모든 서비스는 Correlation ID를 유지하며 로그에 기록합니다.
로그 기록
- 서비스에서 실행되는 모든 작업은 Correlation ID와 함께 로깅됩니다.
- 이후 로그 분석 도구에서 Correlation ID를 기준으로 전체 요청 흐름을 추적합니다.
✅ Correlation ID 예시
1. 클라이언트 → 주문 서비스 → 결제 서비스 → 배송 서비스
요청 하나가 여러 서비스를 거치며 작업이 수행됩니다.
서비스 | 로그 예시 |
---|---|
주문 서비스 | Correlation ID: abc123 - Order Created Successfully |
결제 서비스 | Correlation ID: abc123 - Payment Processed |
배송 서비스 | Correlation ID: abc123 - Shipping Request Sent |
위와 같이 하나의 Correlation ID (abc123)로 모든 로그가 기록되므로, 전체 흐름을 추적할 수 있습니다.
2. Spring Boot에서 Correlation ID 구현 예시
HTTP 요청 시 Correlation ID를 설정하고 로그에 출력하는 필터를 구현합니다.
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.UUID;
@Component
public class CorrelationIdFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
// 요청 헤더에서 Correlation ID 가져오기 (없으면 새로 생성)
String correlationId = httpRequest.getHeader("X-Correlation-ID");
if (correlationId == null || correlationId.isEmpty()) {
correlationId = UUID.randomUUID().toString();
}
// Correlation ID를 로그 MDC에 저장
MDC.put("correlationId", correlationId);
try {
chain.doFilter(request, response);
} finally {
MDC.remove("correlationId"); // 요청 처리 후 제거
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
application.yml에서 로그 포맷에 Correlation ID 포함하기:
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%X{correlationId}] %-5level %logger{36} - %msg%n"
✅ 주요 HTTP 헤더
X-Correlation-ID
: Correlation ID를 전달할 때 주로 사용되는 HTTP 헤더입니다.
✅ 정리
Correlation ID는 분산 시스템에서 하나의 요청을 식별하고, 그 요청이 여러 서비스에서 처리될 때 흐름을 추적할 수 있게 해주는 고유 식별자입니다.
- 용도: 요청 추적, 디버깅, 로깅, 성능 모니터링
- 주요 기술: HTTP 헤더를 통해 전파 (예:
X-Correlation-ID
) - Spring:
MDC
와 같은 기능을 사용해 로그에 포함시키고 전파할 수 있습니다.
쉽게 말해, Correlation ID는 "요청의 흐름을 추적하는 추적 번호"라고 생각하시면 됩니다.
'Microservices Architecture' 카테고리의 다른 글
AWS S3 인스턴스 생성 및 IAM 그리고 Access/Secrete Key 생성 (0) | 2024.12.24 |
---|---|
글로벌 필터(Global Filter) (0) | 2024.12.16 |
/actuator/gateway/refresh의 refresh (0) | 2024.12.16 |
리액티브(Reactive)와 논리액티브(Non-Reactive) (0) | 2024.12.16 |
Spring Cloud Gateway (4) | 2024.12.16 |