- Konu sahibi
- #1
Distributed cache nedir?
Distributed cache, birden fazla uygulama sunucusunun ağ üzerinden ortak kullandığı hızlı geçici veri katmanıdır. Sık okunan sonuçlar veritabanı veya harici servisten her seferinde alınmak yerine önbelleğe yazılır; sonraki istekler bu ortak katmandan karşılanır. Böylece her uygulama örneğinin ayrı kopya tutması önlenebilir; bu mimari tek başına veritabanıyla anlık tutarlılık garantisi sağlamaz.
Nasıl çalışır?
Tipik akış cache-aside modelidir:
- Uygulama, istenen veriye karşılık gelen anahtarla distributed cache üzerinde arama yapar.
- Anahtar bulunursa veri cache hit olarak okunur ve veritabanına gidilmez.
- Anahtar bulunamazsa uygulama veriyi asıl kaynaktan alır, uygun biçime dönüştürür ve cache'e yazar. Bu durum cache miss olarak adlandırılır.
- Verinin süresi dolduğunda veya ilgili kayıt değiştiğinde anahtar silinir ya da yeni değerle güncellenir.
Cache genellikle ağ üzerinde çalışan ayrı bir servis veya servis kümesidir. Uygulama sunucuları ortak cache'e bağlandığı için bir isteğin birinci sunucuya, sonraki isteğin ikinci sunucuya gitmesi aynı önbellek verisine erişilmesini engellemez. Anahtar-değer yapısı yaygındır; değerler metin, JSON veya serileştirilmiş başka bir biçimde tutulabilir.
Somut örnek
İki uygulama örneğini A ve B olarak düşünün. A’nın yerel belleğine yazdığı bir değer B’de görünmez. İkisi de aynı dış cache hizmetine bağlanırsa A’nın yazdığı anahtarı B de okuyabilir. Bu dış hizmet tek sunucuda da çalışabilir; “distributed” sözcüğü mutlaka cache verisinin çok sayıda düğüme bölündüğünü söylemez. Bölümleme, replikasyon ve yüksek erişilebilirlik ayrıca tasarlanır.
Bu farkı test ortamında görünür kılmak için A’dan bir deneme anahtarı yazıp B’den okuyun. Ardından yalnız A uygulamasını yeniden başlatın: dış hizmetteki anahtarın kaybolmaması beklenir. Cache hizmetinin kendisi yeniden başlarsa veya anahtar tahliye edilirse sonuç, ürünün kalıcılık ve süre ayarlarına bağlıdır; veri sonsuza kadar kalacak varsayımı kurmayın.
Sağlayıcı ile arayüz adını da ayırın. Örneğin ASP.NET Core’daki
IDistributedCache ortak bir programlama arayüzüdür; Redis, SQL Server veya başka sağlayıcıyla uygulanabilir. AddDistributedMemoryCache uygulaması ise adına rağmen veriyi her uygulamanın kendi belleğinde tutar ve gerçek paylaşımlı dağıtık cache oluşturmaz.Hangi durumda hangi yaklaşım?
Distributed cache'in amacı, her veriyi kalıcı olarak saklamak değil, pahalı veya sık tekrarlanan okumaları azaltmaktır. Kararı verirken verinin ne kadar süre eski kalabileceğini ve cache kullanılamadığında uygulamanın nasıl davranacağını belirleyin.
| Veri türü | Uygun yaklaşım | Geçerlilik kararı | Dikkat edilmesi gereken |
|---|---|---|---|
| Ürün veya kategori bilgisi | Cache-aside | Süre dolumu ve değişiklikte silme | Eski içerik gösterilebilir |
| Kullanıcı oturumu | Ortak cache'te oturum saklama | Oturum süresine bağlı TTL | Cache kesintisinde oturum davranışı planlanmalı |
| Kısa süreli API yanıtı | Anahtarlı yanıt cache'i | Kısa TTL veya açık geçersiz kılma | Kullanıcıya özel veriler karıştırılmamalı |
Cache tasarımında anahtar adları benzersiz ve öngörülebilir olmalıdır. Dil, tenant, kullanıcı veya izin durumuna göre değişen bir yanıt varsa bu bilgiler anahtarın parçası olmalıdır. Aksi halde bir kullanıcının veya sitenin verisi başka bir isteğe dönebilir.
Uygulama kararları ve adımlar
- Cache'e alınacak veriyi seçin. Sık okunan, yeniden üretmesi pahalı ve kısa süre eski kalması kabul edilebilir verilerle başlayın.
- Her veri türü için anahtar biçimi, değer biçimi, TTL ve güncelleme sırasında yapılacak geçersiz kılma davranışını tanımlayın.
- Cache miss sırasında asıl kaynağa gidin ve sonucu cache'e yazın. Aynı anahtara çok sayıda eşzamanlı miss gelmesini önlemek için kilitleme veya tekil üretim mekanizması gerekebilir.
- Cache bağlantısı başarısız olduğunda veritabanına kontrollü geri dönüş, sınırlı hata yanıtı veya yeniden deneme politikasından uygun olanı belirleyin. Sınırsız yeniden deneme asıl sistemi de aşırı yükleyebilir.
- Hit, miss, gecikme, hata ve bellek kullanımı gibi ölçümleri izleyin. Cache kullanıldığı halde miss oranı yüksekse anahtar tasarımı, TTL veya veri güncelleme akışı gözden geçirilmelidir.
Sık yapılan hatalar
Cache'i veritabanının kalıcı yedeği sanmak en temel hatadır. Cache silinebilir, yeniden başlatılabilir veya geçici olarak erişilemez hale gelebilir; uygulama gerektiğinde veriyi asıl kaynaktan yeniden üretebilmelidir. İkinci önemli hata, yalnızca TTL'ye güvenerek değişen veriyi uzun süre eski bırakmaktır. Kritik güncellemelerde ilgili anahtarı olay sırasında silmek veya güncellemek daha doğru olabilir.
Ayrıca çok büyük nesneleri, sınırsız anahtar sayısını ve kullanıcıya özel yanıtları kontrolsüz biçimde cache'e koymak bellek baskısı oluşturabilir. Serileştirme biçimi uygulama sürümleriyle uyumlu tutulmalı; veri şeması değiştiğinde eski cache kayıtlarının okunamaması için anahtar sürümleme veya güvenli geçiş planı düşünülmelidir.
Sık sorulan sorular
Distributed cache ile CDN aynı şey midir?
Hayır. CDN çoğunlukla son kullanıcıya yakın noktalarda statik dosya veya cache'lenebilir HTTP yanıtı sunar. Distributed cache ise genellikle uygulama sunucularının kullandığı veri katmanıdır; uygulamanın sorgu ve oturum gibi iç verilerini de tutabilir.
Cache tamamen devre dışı kalırsa uygulama çalışabilir mi?
Tasarımına bağlıdır. Cache-aside uygulamalarda uygulama asıl kaynaktan veriyi yeniden alarak kısmen çalışabilir; ancak gecikme ve veritabanı yükü artar. Bu nedenle cache kesintisi önceden bir hata senaryosu olarak test edilmelidir.
Her veriye TTL koymak yeterli midir?
Hayır. TTL kaydın geçerlilik/süre sonunu belirler; yenilemeyi kendiliğinden gerçekleştirmez. Kayıt bellekte daha erken de tahliye edilebilir. Verinin güncellendiği anda eski cache değerinin kullanılmaması gerekiyorsa açık silme veya güncelleme akışı da uygulanmalıdır.