# 수조개 메시지 스케일링하기: Discord가 Cassandra에서 SyllaDB + Rust로 전환한 이유

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

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=9611](https://news.hada.io/topic?id=9611)
- GeekNews Markdown: [https://news.hada.io/topic/9611.md](https://news.hada.io/topic/9611.md)
- Type: news
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2023-07-04T10:16:02+09:00
- Updated: 2023-07-04T10:16:02+09:00
- Original source: [itnext.io](https://itnext.io/scaling-trillions-of-messages-discords-journey-from-cassandra-to-sylladb-with-rust-powered-23e02978dbdb)
- Points: 26
- Comments: 3

## Topic Body

- Discord는 성장하면서 메시징 저장소 DB를 계속 교체하였음   
- 초기에는 단일 MongoDB. 2015년 11월에 메시지 수가 1억개로 늘어나면서 MongoDB 한계가 드러남   
- 2017년에 12노드 클러스터 Cassandra로 전환하여 수십억개의 메시지를 저장   
- 2022년에는 메시지가 수조개로 급증하면서 인프라가 177개 노드로 엄청 늘어났고, 대기시간 예측이 불가능하고 유지보수 비용이 엄청 비싸짐   
- 카산드라 에서 디스코드의 문제는 Hot Partition이었음. DB의 특정 부분이 과부하 되어 전체 어플리케이션의 성능이 저하   
  - 카산드라 내부 데이터 구조가 LSM트리를 활용하므로 쓰기보다 읽기 비용이 더 많이 들고, 단일 서버에서 여러 사용자의 동시 읽기는 핫스팟을 만들고 성능 저하로 이어짐   
  - SSTable 압축과 같은 유지 관리 작업이 전체 성능에 영향을 미쳐서 문제를 가중 시킴   
- 그래서 다양한 구성요소를 통합하여 아키텍처 재설계에 들어감   
  - 모놀리식 API, Rust로 구현된 데이터 서비스, ScyllaDB에 기반한 스토리지 시스템(C++로 개발된 Cassandra 호환 DB)등을 활용   
- ScyllaDB를 채택하면서 상당한 개선이 이루어짐   
  - p99 read latency 는 카산드라의 40~125ms 에 비해 15ms로 감소   
  - p99 write latency 는 카산드라의 5~70ms 에 비해 5ms로 감소   
- 디스코드 엔지니어는 Rust로 데이터 서비스를 작성   
  - Rust의 Feareless Concurrency 기능을 이용하여 핫 파티션에 대한 동시 트래픽을 제어   
  - Rust의 라이브러리와 동시성 기능은 Discord 의 요구사항에 매우 적합했음   
  - 데이터 서비스는 API 모노리스와 데이터베이스 클러스터사이의 중개 서비스 역할을 수행

## Comments



### Comment 16976

- Author: pmc7777
- Created: 2023-07-05T07:20:36+09:00
- Points: 1

마침 디스코드 기술 스택에 대해 알아보고 있었는데 감사합니다!

### Comment 16963

- Author: secret3056
- Created: 2023-07-04T11:07:25+09:00
- Points: 3

[Discord에서 수십억 개의 메시지를 보관하는 방법](https://discord.com/blog/how-discord-stores-billions-of-messages)  
  
* 디스코드는 Go로 작성한 컴포넌트를 GC 스파이크 때문에 Rust로 재작성 했습니다.  
  - [Discord가 Go에서 Rust로 전환하는 이유](https://news.hada.io/topic?id=1455)  
  - [Twitch가 GOGC 플래그로 GC 이슈를 완화한 방법](https://blog.twitch.tv/en/2019/04/10/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap/)  
  
Go의 GC는 상당히 큰 오버헤드라 튜닝 방법도 계속 추가되고 메모리 아레나등이 도입되고 있습니다.

### Comment 16958

- Author: xguru
- Created: 2023-07-04T10:17:01+09:00
- Points: 4

[Cassandra 대체제로 ScyllaDB를 선택해야 하는 이유](https://news.hada.io/topic?id=6684)  
[Discord가 네트웍 디스크의 지연시간을 최소화한 방법](https://news.hada.io/topic?id=7198)
