- Discord büyüdükçe mesaj depolama veritabanını sürekli değiştirdi
- Başlangıçta tek bir MongoDB kullanıyordu. 2015 Kasım’ında mesaj sayısı 100 milyona çıkınca MongoDB’nin sınırları ortaya çıktı
- 2017’de 12 düğümlü bir Cassandra kümesine geçerek onlarca milyar mesajı depoladı
- 2022’de mesaj sayısı trilyonlara fırlayınca altyapı 177 düğüme kadar büyüdü; gecikme süreleri öngörülemez hale geldi ve bakım maliyeti aşırı yükseldi
- Cassandra tarafında Discord’un yaşadığı temel sorun Hot Partition idi. Veritabanının belirli bir kısmı aşırı yükleniyor ve bu da tüm uygulamanın performansını düşürüyordu
- Cassandra’nın iç veri yapısı LSM tree kullandığı için okuma maliyeti yazmadan daha yüksekti; tek bir sunucuda birçok kullanıcının eşzamanlı okuması hotspot oluşturuyor ve performans düşüşüne yol açıyordu
- SSTable sıkıştırması gibi bakım işleri genel performansı etkileyerek sorunu daha da ağırlaştırıyordu
- Bu nedenle çeşitli bileşenleri birleştirerek mimariyi yeniden tasarlamaya giriştiler
- Monolitik API, Rust ile uygulanmış bir veri servisi ve ScyllaDB tabanlı bir depolama sistemi (C++ ile geliştirilmiş, Cassandra uyumlu bir veritabanı) kullandılar
- ScyllaDB’ye geçişle birlikte önemli iyileşmeler sağlandı
- p99 read latency, Cassandra’daki 40~125ms’e kıyasla 15ms’ye düştü
- p99 write latency, Cassandra’daki 5~70ms’e kıyasla 5ms’ye düştü
- Discord mühendisleri veri servisini Rust ile yazdı
- Rust’ın fearless concurrency özelliğini kullanarak hot partition üzerindeki eşzamanlı trafiği kontrol ettiler
- Rust’ın kütüphaneleri ve eşzamanlılık özellikleri, Discord’un gereksinimlerine çok uygundu
- Veri servisi, API monoliti ile veritabanı kümesi arasında aracı servis rolü üstleniyor
3 yorum
Tam da Discord’un teknoloji yığını hakkında bilgi edinirken buna denk geldim, teşekkürler!
Discord milyarlarca mesajı nasıl depoluyor
Go'nun GC'si oldukça büyük bir ek yük oluşturduğundan, ayarlama yöntemleri de sürekli ekleniyor ve memory arena gibi yapılar devreye alınıyor.
Cassandra yerine neden ScyllaDB seçilmeli
Discord'un ağ diskinde gecikmeyi en aza indirme yöntemi