Discord의 Elixir 시스템 추적하기 (모든 것을 녹이지 않고)
Discord의 Elixir 시스템 추적 기술은 Elixir의 경량 프로세스와 메시지 전달 방식을 활용하여 각 Discord 서버(내부적으로 '길드'라 칭함)를 독립적으로 운영함으로써 대규모 사용자 활동을 실시간으로 처리합니다.
분산 추적(Distributed Tracing) 도입을 위해 Discord는 기존 HTTP 헤더 기반 추적 방식이 아닌, Elixir 메시지 전달 구조에 맞춘 자체 메시지 포장 라이브러리인 Transport를 개발하여, 메시지에 추적 메타데이터를 포함시키고 이를 서비스 간에 전파할 수 있도록 하였습니다.
Transport의 Envelope 구조체는 메시지와 추적 컨텍스트를 함께 감싸고, 이를 통해 Elixir의 GenServer 호출과 일반 메시지 전달 모두에서 추적 정보를 손쉽게 주고받을 수 있게 하여, 점진적이고 무중단 배포가 가능하도록 설계되었습니다.
또한, Discord는 대규모 팬아웃(fanout) 상황에서 발생하는 추적 데이터 폭증 문제를 해결하기 위해 동적 샘플링 기법을 도입, 수신자 수에 따라 추적 샘플링 비율을 조절하여 성능 저하와 비용을 최소화했습니다.
마지막으로, 추적 오버헤드를 줄이기 위해 비샘플링(trace unsampled) 컨텍스트의 전파를 제한하고, gRPC 요청 처리 시 빠른 플래그 검사로 불필요한 컨텍스트 해제를 방지하는 최적화도 적용하여, Discord의 대규모 Elixir 시스템에 맞는 효율적인 분산 추적 환경을 구축하였습니다.
이로써 Discord는 사용자 경험 저하 원인 분석과 시스템 병목 탐지에 큰 도움을 받고 있으며, 대규모 실시간 메시징 시스템에서의 분산 추적 구현 사례로서 실용적 가치를 제공합니다.
