상세 컨텐츠

본문 제목

Discord가 웹소켓 트래픽을 40% 감소시킨 방법

소프트웨어공학

by amanda.hyon 2024. 9. 29. 02:28

본문

https://discord.com/blog/how-discord-reduced-websocket-traffic-by-40-percent

 

  • 클라이언트가 Discord에 연결하면 "게이트웨이"라고 하는 서비스를 통해 무슨 일이 일어나고 있는지에 대한 실시간 업데이트를 받음
  • 2017년 말부터 클라이언트의 게이트웨이 연결은 zlib를 사용하여 압축되어 메시지의 크기가 2배에서 10배까지 작아졌음
  • Zstandard(zstd)는 zlib보다 압축률이 높고 압축 시간이 짧으며, 사전 기능을 지원해 대역폭을 추가로 줄일 수 있음
  • 2019년 zstd 테스트 결과는 그다지 긍정적이지 않았으나, 다시 시도해볼 가치가 있다고 판단함

Zstd 스트리밍

  • Zlib은 스트리밍 압축을 사용한 반면, zstd는 그렇지 않았음
  • 작은 페이로드에서 zstd가 zlib보다 성능이 떨어졌음
  • Elixir용 zstd 바인딩인 ezstd를 포크하여 스트리밍을 추가함
  • Zstd 스트리밍으로 전환한 결과 zlib 스트리밍보다 압축률과 속도 면에서 크게 개선됨

최적화 노력

튜닝

  • Chainlog, hashlog, windowlog 등 zstd 압축 매개변수를 조정하여 메모리 사용량과 압축 시간의 균형을 맞춤

 

Zstd 딕셔너리

  • Zstd의 사전 기능을 활용하여 압축률을 높이려 했으나 효과는 제한적이었음
  • 사전 사용의 복잡성이 이점보다 크다고 판단하여 도입하지 않기로 함

 

버퍼 업그레이드

  • 비사용 시간대의 여분 메모리를 활용해 zstd 버퍼를 업그레이드하는 피드백 루프를 구현
  • 예상보다 업그레이드 비율이 낮았고, BEAM 할당자 설정 조정 등으로 개선을 시도했으나 복잡성 대비 이점이 크지 않아 철회함

 

구현과 출시

  • Zstd의 대역폭 개선 효과가 커서 모바일뿐 아니라 데스크톱에도 적용하기로 함
  • Java, Objective-C, Rust 등 각 플랫폼에 맞는 zstd 바인딩을 찾아 몇 달에 걸쳐 단계적으로 출시함

 

추가 성과: Passive Sessions V2

  • Zstd 적용 과정에서 passive_update_v1 메시지가 게이트웨이 대역폭의 30% 이상을 차지한다는 것을 발견함
  • 변경된 채널/멤버만 전송하는 passive_update_v2를 도입하여 해당 대역폭을 35%에서 5%로 줄임

 

큰 절감 효과

  • Passive Sessions v2와 zstd의 결합으로 클라이언트가 사용하는 게이트웨이 대역폭을 거의 40% 감소시킴
  • 의도치 않은 최적화 기회를 발견한 것은, 적절한 계측과 비판적 시각으로 그래프를 분석하는 것의 중요성을 보여줌

관련글 더보기

댓글 영역