- Sistem tasarımında kusursuz tutarlılık, erişilebilirlik, düşük gecikme ve yüksek iş hacmini aynı anda sağlamak pratikte oldukça zordur
- Uygulamaya uygun denge noktasını bularak doğru tasarımı seçmek önemlidir
- Bluesky, following feed/zaman akışı tasarımında yazma performansını iyileştirmek için tutarlılıktan kısmen ödün veren bir trade-off uyguladı
- Sonuç olarak, kullanıcılar üzerinde olumsuz bir etki yaratmadan P99 gecikmesini %96’dan fazla azalttı
Zaman akışı fan-out
- Bluesky’da bir kullanıcı gönderi paylaştığında, bu içerik sistem tarafından indekslenir, veritabanına kaydedilir ve API yanıtlarıyla sunulur
- Aynı anda bu gönderi, her bir takipçinin zaman akışı tablosuna eklenen bir “fan-out” sürecinden geçer
- Bunun için önce takipçi listesi alınır, ardından her takipçinin zaman akışı tablosuna ters sırada ekleme yapılır
- Zaman akışı tabloları kullanıcı bazında partition edilerek dağıtık veritabanı (ScyllaDB) üzerinde tutulur ve yüksek erişilebilirlik için birden çok shard’a replike edilir
- Her kullanıcı farklı bir shard’a atanabilir
- Depolama alanından tasarruf etmek için, belirli bir uzunluğu aşan zaman akışlarında eski gönderi referansları düzenli olarak silinir
Hot shard sorunu
- Bluesky’nin yaklaşık 32 milyon kullanıcısı vardır ve zaman akışı veritabanı yüzlerce shard’a bölünmüştür
- Milyonlarca kişinin kullandığı bir sistemde, olağanüstü sayıda takip ilişkisine sahip kullanıcılar ortaya çıkabilir
- Örnek: yüz binlerce hesabı takip eden bir kullanıcı
- Tek bir shard içinde çok sayıda kullanıcının zaman akışı birlikte tutulur
- Belirli bir kullanıcı çok fazla yazma işlemi tetiklerse ilgili shard aşırı yüklenir ve “hot shard” hâline gelir
- Bu tür hot shard’larda yazma veya okuma işlemleri yoğunlaştığı için, aynı shard’daki diğer kullanıcılara da gecikme yayılır
Gecikmenin birikmesi
- Bir kullanıcının 2.000.000 takipçisi varsa, yazma işlemleri sıralı yapılırsa 20 dakikadan uzun sürebilir
- Bunu azaltmak için fan-out paralelleştirildiğinde ortalama gecikme kısalır
- Ancak P99 gecikmesi (yaklaşık 15 milisaniye ve üzeri) birçok kez ortaya çıkarak tüm paralel işi yavaşlatabilir
- Takipçi sayısı çok yüksek olduğunda, P99 veya P99.9 gecikmeleri yüzünden toplam fan-out süresi en kötü durumda birkaç dakikadan onlarca dakikaya kadar uzayabilir
Kayıplı zaman akışı
- Aşırı sayıda hesabı takip eden kullanıcılara tüm gönderileri tam ve doğru sırayla göstermek pratikte mümkün değildir
- Zaten bir insanın bu kadar çok gönderinin tamamını gerçekten tüketmesi de zordur
- Bu yüzden belirli bir eşiği (ör.
reasonable_limit) aşan takip sayısına sahip kullanıcıların zaman akışında bazı yazmaların olasılıksal olarak “drop” edilmesi yaklaşımı benimsendi
loss_factor = min(reasonable_limit / num_follows, 1) formülü kullanılır
- Fan-out sırasında rastgele bir değer üretilir; bu değer
loss_factor değerinden büyükse zaman akışına yazma atlanır
- Böylece belirli kullanıcı zaman akışlarına aşırı yazma sınırlandırılır ve shard genelindeki performans düşüşü önlenir
Önbellekleme hakkında
- Zaman akışına yazma işlemleri saniyede bir milyondan fazla gerçekleştiği için, her yazmada kullanıcının takip sayısını doğrudan veritabanından sorgulamak çok büyük yük oluşturur
- Bunun yerine, yüksek takip sayısına sahip hesaplar Redis’te sorted set olarak önbelleğe alınır
- Fan-out servis instance’ları bu önbellek bilgisini her 30 saniyede bir belleğe yükler
- Sonuç olarak fan-out sırasında da çok takip edilen kullanıcı bilgileri hızlıca sorgulanabilir
- Önbellek bilgisinin tamamen güncel olması gerekmediğinden, bir miktar kusuru kabul ederek performans ve ölçeklenebilirlik artırılır
Sonuç
- Kayıplı zaman akışının devreye alınmasının ardından Timelines veritabanındaki hot shard’lar fiilen ortadan kalktı
- Bir fan-out sayfasını işlemenin P99 gecikmesi %90’dan fazla azaldı
- Toplam fan-out süresine bakıldığında, P99 bazında 5-10 dakika süren işler 10 saniyenin altına indi
- Bununla, tutarlılıktan bir miktar ödün verilse bile kullanıcı beklentilerinin rahatlıkla karşılanabildiği ve büyük ölçekli genişlemenin sürdürülebildiği gösterildi
- Bluesky zaman akışı mimarisinde hâlâ iyileştirme alanları olsa da, bu değişiklik yazma throughput’unu ve ölçeklenebilirliği büyük ölçüde artırdı
1 yorum
Hacker News yorumu
Sistem meraklısı olarak bu tür yazılardan hoşlanan biriyim. "Mükemmel olmalı" düşünce yapısına kapılmak kolay
Zaman akışını hesapların popülerliğine göre hibrit bir şekilde neden uygulamadıklarını merak ediyorum
İlginç bir probleme ilginç bir çözüm. Paylaştığın için teşekkürler
Tutarlılıktan ödün veren bu stratejiyi merak ediyorum. Okumada ya da yazmada tam fan-out dışında başka yöntemler üzerine düşündüler mi diye merak ediyorum
Her kullanıcının takip ettiği binlerce kişinin paylaştığı her şeyi kusursuz kronolojik sırayla sunmak gerekmiyor, ama zaman akışında her zaman yeni içerik olacak kadar içerik sunmak mantıklı
Hot shard sorununu önlemek için takipçi sayısını sınırlamanın nasıl işleyeceğini merak ediyorum
AWS'nin bu sorun için hoş, genel bir yaklaşımı var
Yüz binlerce kullanıcıyı takip eden hesapların içerik kazıyan bot hesaplar olduğu açık. Engeller geçerim
Doğrudan kullanıcının profiline gidip tüm gönderileri gördüğünüzde, zaman akışında olması gereken bazı gönderilerin eksik olduğu oluyor
Her "sayfa"nın bir sonraki sayfanın getirilmesini engelleyecek şekilde fan-out'u neden uyguladıklarını merak ediyorum