26 ポイント 投稿者 xguru 2023-07-04 | 3件のコメント | WhatsAppで共有
  • 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件のコメント

 
pmc7777 2023-07-05

ちょうどDiscordの技術スタックについて調べていたところだったので、ありがとうございます!

 
secret3056 2023-07-04

Discordが数十億件のメッセージを保存する方法

GoのGCはかなり大きなオーバーヘッドであるため、チューニング手法も継続的に追加されており、メモリアリーナなども導入されています.