Microservices Architecture / / 2024. 12. 16. 14:03

Correlation ID

Correlation ID분산 시스템이나 마이크로서비스 아키텍처에서 사용되는 개념으로, 하나의 요청(Request)과 그와 관련된 모든 작업을 추적하기 위해 사용하는 고유한 식별자입니다.


Correlation ID의 역할

  • 요청과 응답의 흐름을 추적하기 위한 유일한 ID입니다.
  • 서비스 간의 여러 요청이 발생할 때, 하나의 작업 단위(트랜잭션)를 식별하고 추적할 수 있습니다.
  • 로그나 모니터링 도구에서 하나의 요청에 대한 전체 흐름을 확인할 수 있습니다.

왜 Correlation ID가 필요할까?

  1. 분산 시스템에서의 요청 추적

    • 마이크로서비스에서는 하나의 요청이 여러 서비스로 전달되며, 각 서비스가 여러 단계로 작업을 수행합니다.
    • Correlation ID를 사용하면 전체 요청 흐름을 추적할 수 있습니다.
  2. 디버깅 및 로깅

    • 요청이 실패하거나 오류가 발생했을 때, 로그를 쉽게 필터링하고 분석할 수 있습니다.
  3. 성능 모니터링

    • 요청당 응답 시간을 측정하고 병목 지점을 파악할 수 있습니다.

Correlation ID의 작동 방식

  1. 요청 시작

    • 클라이언트가 요청을 보내면 서버에서 고유한 Correlation ID를 생성합니다.
    • 클라이언트가 이미 Correlation ID를 보냈다면, 이를 사용합니다.
  2. 서비스 간 전파

    • 생성된 Correlation ID는 HTTP Header나 메시지에 포함되어 다른 서비스로 전파됩니다.
    • 모든 서비스는 Correlation ID를 유지하며 로그에 기록합니다.
  3. 로그 기록

    • 서비스에서 실행되는 모든 작업은 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는 "요청의 흐름을 추적하는 추적 번호"라고 생각하시면 됩니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유