분산 시스템에서의 마이크로서비스 아키텍처는 기능의 모듈화와 독립성을 강화하지만, 동시에 디버깅과 모니터링을 급격하게 어렵게 만든다. 이런 환경에서 효과적으로 문제를 추적하고 분석하기 위해서는 분산 추적(Distributed Tracing)기술이 필요하다. MSA가 적용된 Joinus 프로젝트에서도 Spring Cloud Sleuth와 Zipkin을 이용하여 분산 추적을 구축 하였다.
핵심은 Trace id 와 Span id를 추적하는 것이다.
Spring Cloud Sleuth는 마이크로서비스간의 요청 흐름을 추적하기 위한 라이브러리로, Spring Boot 애플리케이션에 쉽게 통합할 수 있다는 장점이 있다. Sleuth는 요청에 Trace와 Span 정보를 자동으로 생성하고 전달하여, 마이크로서비스 간의 상호작용을 추적할 수 있게 한다.
Zipkin은 분산 추적 데이터를 수집, 저장, 검색 및 시각화하는 오픈 소스 도구이다. Spring Cloud Sleuth와 결합하여, 마이크로서비스 간의 요청 흐름을 시각적으로 확인하고 성능 문제를 진단할 수 있다.
Spring 생태계와의 호환성, 간단한 설치 및 설정, 커뮤니티 지원, 성능 및 확장성, 직관적인 사용자 인터페이스, 그리고 유연한 커스터마이징을 제공하여 Jaeger, OpenTelemetry, Elastic APM등의 비교군과 비교했을 때 여러 가지 이점을 가지므로 채택하게 되었다.
우선, Joinus 프로젝트는 모든 어플리케이션이 Docker-network로 관리 되기 때문에, 분산 추적또한 docker기반으로 구축 하였다.
#Zipkin settings
spring.zipkin.base-url=http://localhost:9411
spring.zipkin.enabled=true
#Sleuth settings
#How many gatther samples
spring.sleuth.sampler.probability= 1.0
여기서 spring.sleuth.sampler.probability 는 얼마나 많은 sample을 수집할 것인지를 비율적으로 설정한다.(1.0 = 100%)
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth:3.0.6'
implementation 'org.springframework.cloud:spring-cloud-starter-zipkin:2.2.8.RELEASE'
간단하게 docker기반으로 실행하기만 하면 준비는 끝난다.
docker run -d -p 9411:9411 --network joinus-network --name zipkin openzipkin/zipkin
이로서 Joinus의 분산 추적 시스템 구축을 소개를 마친다.
아키텍처 내에서 발생하는 이슈를 탐지하는 일은 중요하죠, MSA가 많이 사용되면서 서비스 별로 분산 추적을 할 수 있는 기술 도입은 올바른 선택이었던 거 같네요!
Sleuth에 핵심 인터페이스인 Tracer이랑 Span을 자세히 살펴 볼 필요도 있을 것 같습니다. 예를 들면 Reporting Span 정보가 유실 될 수 있기에 유실에 대한 대비를 미리 알아두는 것도 좋겠어요.