2015 年,Discord 开始使用 MongoDB 来存储消息。到 2015 年 11 月,已经有 1 亿条消息无法放入 RAM,导致不可预测的延迟。
2017 年,Discord 开始在 Cassandra 数据库中存储数十亿条消息。到 2022 年,存储在 177 个节点上的消息数量激增至数万亿条。
但Cassandra被几个严重的问题所困扰。
当少量高流量通道使节点不堪重负时,就会发生热分区,从而在整个集群中级联延迟。
垃圾回收暂停了创建的延迟峰值。
压缩滞后,迫使成本高昂的读取来查询多个 SSTable。
维护,如节点修复、服务中断。
Discord 迁移到 ScyllaDB 具有以下好处:
用 C++ 而不是 Java 编写,消除了破坏性的垃圾回收暂停
每核分片模式提供更强的工作负载隔离,防止热分区在节点之间级联延迟。
优化反向查询性能以满足 Discord 的需求
他们将节点减少到 72 个,同时将每个节点的磁盘空间增加到 9TB。
为了进一步保护 ScyllaDB,Discord:
在 Rust 中构建了中间数据服务,限制了并发流量峰值
数据服务位于 API 和数据库之间,合并请求
即使多个用户请求相同的数据,也只需查询一次数据库
Rust 提供了快速、安全的并发性,非常适合这种工作负载
结果如何?尾部延迟从 40-125 毫秒降至稳定的 15 毫秒。数据库正常运行时间从周末的中断改善到一帆风顺。该系统可以轻松处理世界杯流量高峰,毫不费力地处理进球和点球等事件。Discord 继续扩展,现在使用 ScyllaDB 可靠地存储数万亿条消息。