Discord의 Elixir 시스템 추적 (모든 것을 녹이지 않고)
Source: Discord Engineering
배경
Discord에서는 채팅, 반응, 밈 게시가 즉각적으로 느껴지도록 목표합니다. 우리는 각 Discord 서버(“길드”)가 서로 완전히 독립적으로 실행되도록 Elixir의 강력한 동시성 메커니즘을 활용해 대규모로 이를 구현합니다.
관측 워크플로우
길드가 사용자 활동을 따라가지 못하면 지연이 발생하거나 완전한 장애가 발생할 수 있습니다. 시스템이 자체 복구 지점을 넘어선다면, 온콜 엔지니어가 개입하여 우리의 관측 도구를 사용해 원인을 파악하고 재발을 방지합니다.
조사는 메트릭과 로그를 살펴보는 것부터 시작됩니다. 우리는 다양한 측정을 도입했으며, 여기에는 각 사용자 행동 유형이 얼마나 자주 처리되는지와 처리에 걸리는 시간이 포함됩니다. 이러한 메트릭은 종종 새로 출시된 게임에 대한 과도한 hype와 반응 같은 폭발적인 활동을 드러내지만, 사용자 경험을 완전히 포착하지는 못합니다. 이는 자동차 대시보드가 엔진 온도는 알려주지만 뜨거워졌을 때의 결과는 알려주지 않는 것과 비슷합니다.
길드 타이밍
메트릭으로 결과가 나오지 않을 경우, 온콜 엔지니어는 guild timings이라는 맞춤형 도구를 사용합니다. 길드가 행동을 처리할 때마다 현재 분의 어느 정도가 각 행동 유형에 사용됐는지를 메모리 내 저장소에 기록합니다. 이 데이터는 메트릭보다 훨씬 상세하지만, 방출량이 너무 많아 모두 저장할 수 없습니다. 따라서 가장 큰 길드를 제외하고는 데이터가 자주 회전됩니다. 즉시 가져오더라도, 다운스트림 효과를 포착하지 못하기 때문에 엔드‑투‑엔드 경험을 완전하게 보여주지는 못합니다.
분산 추적
Discord의 다른 팀들은 분산 추적(애플리케이션 성능 모니터링)을 활용해 큰 가치를 얻었습니다. 이는 작업의 각 구성 요소가 얼마나 오래 걸렸는지를 보여줍니다. Elixir 스택에 추적을 추가하려면 추가 작업이 필요했습니다. 대부분의 추적 도구는 HTTP 헤더와 같은 메타데이터 레이어를 통해 작업 정보를 전파하지만, Elixir의 기본 통신 도구에는 이러한 레이어가 기본적으로 제공되지 않습니다.
구현
우리는 서비스 간 메타데이터를 전파하기 위한 자체 추적 레이어를 구축했습니다. 서비스 간 통신 방식을 변경하면서도 다운타임 없이 솔루션을 통합했습니다.