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

> Clean Markdown view of GeekNews topic #16885. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=16885](https://news.hada.io/topic?id=16885)
- GeekNews Markdown: [https://news.hada.io/topic/16885.md](https://news.hada.io/topic/16885.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-09-23T09:38:03+09:00
- Updated: 2024-09-23T09:38:03+09:00
- Original source: [discord.com](https://discord.com/blog/how-discord-reduced-websocket-traffic-by-40-percent)
- Points: 23
- Comments: 1

## Summary

Discord는 zstd 스트리밍 압축을 도입하여 zlib보다 높은 압축률과 속도를 달성했습니다. 또한, passive_update_v2 메시지를 통해 게이트웨이 대역폭을 크게 줄여 클라이언트 트래픽을 40% 감소시켰습니다. 이 과정에서 적절한 계측과 비판적 분석의 중요성을 강조하며, Zstd 적용을 최적화한 내용을 공유합니다.

## Topic Body

- 클라이언트가 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% 감소시킴  
- 의도치 않은 최적화 기회를 발견한 것은, 적절한 계측과 비판적 시각으로 그래프를 분석하는 것의 중요성을 보여줌

## Comments



### Comment 29119

- Author: neo
- Created: 2024-09-23T09:38:03+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41604267)   
- Discord의 실행 시간이 20-30초 걸리는 문제에 대한 불만이 있음  
  - $5000 PC에서도 느린 실행 속도에 대한 의문 제기  
  - 클라이언트를 매번 단일 코어로 다시 컴파일하는 것 같다는 비유 사용  
  
- 압축 비율과 네트워크 대역폭 감소에 집중한 것 같음  
  - CPU 시간이나 실제 사용자에게 측정 가능한 개선 사항에 대한 언급이 없음  
  - 회사에서 비슷한 노력을 했을 때 압축/압축 해제 오버헤드로 인해 성능이 더 나빠졌음  
  
- JSON과 Erlang ETF를 사용한 사전 기반 압축 접근 방식이 흥미로움  
  - Cap'n Proto나 Protobufs 같은 스키마 기반 시스템으로 전환하는 대신 선택한 방식  
  - Zstandard와 LZ4의 벤치마크에 관심이 있음  
  - 드론의 스트리밍 오버레이/HUD 데이터의 경우 LZ4를 사용했으며, Zstd 사전 도구로 생성된 사전을 사용해 높은 속도로 유사한 압축을 달성했음  
  
- 일반적인 부트스트래핑 응답(READY)이 2MB 이상이라는 점이 놀라움  
  
- PASSIVE_UPDATE_V1 디스패치의 실제 내용에 대한 언급  
  - 단일 요소만 변경되었을 때도 모든 채널, 멤버 또는 음성 멤버를 전송함  
  - zstd 실험 중 발견된 메트릭이 놀라운 행동을 보여줌  
  - 처음부터 메트릭 분석을 하지 않은 이유에 대한 의문  
  - 처음부터 델타를 전송하지 않은 이유에 대한 의문  
  
- 압축 오라클 공격(BREACH)과 같은 공격에 대한 안전성 언급이 없음  
  - Discord가 압축 롤아웃에 많은 노력을 기울였다는 점에서 이를 고려했을 것이라 믿음  
  - 더 구체적인 내용을 작성했으면 좋겠다는 의견  
  
- Discord 탭을 열면 컴퓨터가 느려지는 문제가 있음  
  
- 시도했지만 잘 되지 않은 것들을 설명한 점이 매우 좋음  
  - 실패한 시도를 설명하는 기사가 점점 드물어지고 있지만, 이는 매우 흥미롭고 도움이 됨  
  
- mIRC가 더 잘 했다는 의견
