- Discordは成長に伴い、メッセージ保存用DBを継続的に置き換えてきた
- 初期は単一のMongoDBだった。2015年11月にメッセージ数が1億件に増えると、MongoDBの限界が明らかになった
- 2017年に12ノードクラスタのCassandraへ移行し、数十億件のメッセージを保存
- 2022年にはメッセージが数兆件へ急増し、インフラは177ノードまで大幅に拡大、レイテンシの予測が不可能になり、保守コストも非常に高くなった
- CassandraにおけるDiscordの問題はHot Partitionだった。DBの特定部分に負荷が集中し、アプリケーション全体の性能が低下
- Cassandraの内部データ構造はLSMツリーを活用するため、書き込みより読み取りのコストが大きく、単一サーバーで複数ユーザーの同時読み取りがホットスポットを生み、性能低下につながった
- SSTable圧縮のようなメンテナンス作業が全体性能に影響し、問題をさらに悪化させた
- そのため、さまざまな構成要素を統合してアーキテクチャの再設計に着手
- モノリシックAPI、Rustで実装されたデータサービス、ScyllaDBベースのストレージシステム(C++で開発されたCassandra互換DB)などを活用
- ScyllaDBの採用により、大幅な改善が実現
- p99 read latency はCassandraの40〜125msに対して15msへ低下
- p99 write latency はCassandraの5〜70msに対して5msへ低下
- DiscordのエンジニアはRustでデータサービスを作成
- RustのFearless Concurrency機能を利用して、ホットパーティションへの同時トラフィックを制御
- Rustのライブラリと並行処理機能はDiscordの要件に非常によく適合していた
- データサービスはAPIモノリスとデータベースクラスタの間で仲介サービスの役割を果たした
3件のコメント
ちょうどDiscordの技術スタックについて調べていたところだったので、ありがとうございます!
Discordが数十億件のメッセージを保存する方法
GoのGCはかなり大きなオーバーヘッドであるため、チューニング手法も継続的に追加されており、メモリアリーナなども導入されています.
Cassandraの代替としてScyllaDBを選ぶべき理由
Discordがネットワークディスクのレイテンシを最小化した方法