Merhaba? Ben Jayon.
Bugün, önbellek ayarlama kriterlerini açıklayacağım. Kişisel olarak iş tecrübelerime dayanarak yazdığım bir gönderi olduğu için, sadece referans olarak kullanmanızda fayda var ㅎㅎ
Önbellek Nedir?
Önbellek, daha sonra talep edilecek sonuçları önceden depolamayı ve hızlı bir şekilde hizmeti sunmayı ifade eder. Yani, sonucu önceden depolar ve daha sonra bir istek geldiğinde, DB veya API'ye başvurmak yerine önbelleğe erişerek isteği işler. Bu önbelleğin ortaya çıkmasının altında Pareto ilkesi yatmaktadır.
Pareto ilkesi, sonuçların %80'inin nedenlerin %20'sinden kaynaklandığı anlamına gelir ve aşağıdaki resme bakmanız faydalı olabilir!
Yani, önbellek tüm sonuçları önbelleğe almak zorunda değildir ve yalnızca en çok kullanılan %20'sini önbelleğe alarak genel olarak verimliliği artırabilir.
Hangi Verileri Önbelleğe Almalıyız?
Pareto ilkesine göre, herhangi bir veriyi önbelleğe almamalıyız ve yalnızca gerekli verileri önbelleğe almalıyız. Peki, hangi verileri önbelleğe almalıyız?
Sık Okunması Gereken Ancak Yazma İşleminin Çok Az Olduğu Veriler
Doğru, teorik olarak “sık okunması gereken ancak yazma işleminin çok az olduğu veriler için önbellek kullanılmalıdır” denir, ancak “sık okuma” ve “yazma işleminin çok az olması” kriterleri oldukça belirsizdi.
Bu nedenle, önbelleğe alınacak verileri araştırmak için aşağıdaki adımları izliyorum.
- APM (Uygulama Performansı İzleme) araçlarından biri olan DataDog'u kullanarak RDB'nin (İlişkisel Veritabanı) sorgu çağrı geçmişinin ilk 5'ini kontrol ediyorum.
- Bunlardan, sorguyu bulup hangi tablodaki verileri çektiğini kontrol ediyorum.
- İlgili tablonun güncelleme sorgusunun ne kadar çağrıldığını kontrol ediyorum.
Bu adımları izleyerek, sorgu sayısının çok olup güncelleme sorgusunun az olup olmadığına bakıyorum. İş tecrübelerime dayanarak kontrol ettiğim tabloda, sorgu sayısı günde 1.74 milyon iken güncelleme sorgusu en fazla 500 idi. Bu durumda, herkesin önbellek için uygun bir koşul olduğunu kabul edebileceğini düşünüyorum ㅎㅎ
Güncelleme Duyarlı Veriler
Güncelleme duyarlı veriler, RDB ile önbellek arasındaki tutarsızlığın kısa olması gerektiği anlamına gelir. Örneğin, ödemeyle ilgili bilgiler son derece güncelleme duyarlı olduğundan, yukarıdaki önbellek koşuluna uygun olsa bile uygulamayı gözden geçirmek gerekir.
Yukarıdaki iki özelliğe uyan ödemeyle ilgili tabloda önbellek kullanmam gerekiyordu. Bu nedenle, ilgili ödeme tablolarını kullanan tüm iş mantıklarında önbellek uygulamadım ve gerçekte ödeme yapılmayan nispeten güvenli iş mantıklarına kısmi olarak önbellek uygulamak üzere karar verdim.
Yerel Önbellek mi, Küresel Önbellek mi?
Şimdi, önbelleğe alınacak verileri ve önbelleğe alma kapsamını belirledik. Peki, önbelleğe alınacak verileri ‘nereye’ depolayacağımızı düşünmemiz gerekiyor. Genellikle yerel belleğe veya Redis gibi ayrı bir sunucuya depolayabiliriz.
Yerel Önbellek
Yerel önbellek, uygulama sunucusunun belleğinde önbelleğe alınacak verileri depolamak için kullanılan bir yöntemdir ve genellikle Guava önbelleği veya Caffeine önbelleği kullanılır.
**Avantajlar**
- Uygulama mantığını çalıştırırken aynı sunucu içindeki bellekten önbelleği sorguladığı için hız açısından oldukça iyidir.
- Uygulaması kolaydır.
**Dezavantajlar**
- Birden fazla örneğiniz varsa çeşitli sorunlar ortaya çıkar.
Küresel Önbellek
Küresel önbellek, Redis gibi önbelleğe alınacak verileri ayrı bir sunucuda depolamak için kullanılan bir yöntemdir.
**Avantajlar**
- Örnekler arasında önbelleği paylaştığı için bir örnekte yapılan bir önbellek değişikliği tüm örnekler tarafından görülebilir.
- Yeni bir örnek oluşturulduğunda, mevcut önbellek deposuna erişebildiği için önbelleği doldurma işlemi yapmaya gerek yoktur.
**Dezavantajlar**
- Ağ trafiği gerektirdiği için yerel önbelleğe göre hızı daha düşüktür.
- Ayrı bir önbellek sunucusu kurulması gerektiğinden altyapı yönetim maliyeti oluşur.
Yazar Hangi Yöntemi Seçti?
Şu anda şirketin uygulama sunucuları birden çok örnek çalıştıran bir yapıya sahip ancak ben yerel önbelleği seçtim.
Bunun üç temel nedeni var.
- RDB'de depolanan önbelleğe alınacak verilerin sayısı yaklaşık 40.000'dir ve bunların hepsini belleğe yüklemek bile 4 MB'den azdır.
- Ödemeyle ilgili veriler için sorgu performansının iyileştirilmesi gerekiyordu.
- Redis zaten mevcut olsa da, yeni önbelleği Redis'e depolamak altyapı maliyetine neden olur.
Önbellek Nasıl Güncellenecek?
Birden fazla uygulama sunucunuz ve bunlara yerel önbellek uyguladıysanız, her uygulama sunucusunda depolanan önbellek değerleri farklı olabilir. Örneğin, A sunucusunda depolanan önbellek verisi “1” iken, B sunucusunda depolanan önbellek verisi B sunucusunda değişiklik yapıldığı için “2” olabilir. Bu durumda, kullanıcı yük dengeleyiciye istek gönderdiğinde, A ve B sunucularından farklı veriler alabilir.
Bu nedenle, her örnekte önbelleği otomatik olarak temizleyip RDB'den sorgu yapacak şekilde yapılandırmak gerekir ve bu durumda çoğunlukla TTL kullanılır.
TTL Ne Kadar Olmalı?
TTL, Time To Live'ın kısaltmasıdır ve belirli bir süre sonra önbelleği silmek için kullanılan bir ayardır. Örneğin, TTL'yi 5 saniye olarak ayarladıysanız, önbellek verileri 5 saniye sonra otomatik olarak silinir. Ardından, önbellekten veri çekilememesi durumunda RDB'den veriler çekilir ve depolanır.
Peki, TTL ne kadar olmalı?
**Okuma/Yazma İşlemi Tek Bir Önbellek Sunucusunda Gerçekleşiyorsa**
Okuma/yazma işlemi Redis gibi tek bir küresel önbellek sunucusunda veya yerel önbelleğe sahip tek bir uygulama sunucusunda gerçekleşiyorsa, TTL değeri saat birimleri veya daha uzun süreler için ayarlanabilir. Zaten yazma işlemi yapıldığında eski önbelleği güncelleyeceğiz ve ilgili verileri çeken sunucu her zaman güncellenmiş verileri görecektir.
Bu durumda, TTL'yi ayarlamak yerine, önbellek sunucusu dolduğunda LRU algoritmasını kullanarak önbelleği kademeli olarak temizlemek de mümkündür.
**Okuma/Yazma İşlemi Birden Fazla Önbellek Sunucusunda Gerçekleşiyorsa**
Okuma/yazma işlemi çoklu küresel önbellek sunucularında veya yerel önbelleğe sahip birden çok uygulama sunucusunda gerçekleşiyorsa, TTL saniye veya dakika birimleriyle kullanılması önerilir. Çünkü güncellenmiş verileri henüz yansıtmayan önbellek sunucusundaki eski verileri okuma olasılığı vardır.
Bu durumda TTL, farklı bağlamlarda belirlenir; güncelleme önemliyse ve değerlerin değişme olasılığı yüksekse TTL daha kısa olmalı, güncelleme daha az önemliyse ve değerlerin değişme olasılığı düşükse TTL biraz daha uzun olabilir.
Yazar TTL'yi Nasıl Ayarladı?
Önbelleğe alacağım veriler ödemeyle ilgili ve gerçekte ödeme yapılan kesin iş mantıklarında önbellek uygulanmasa bile, ödeme özelliği gereği güncelleme önemlidir. Ancak, güncelleme olasılığı düşük olduğu için TTL'yi 5 saniye olarak güvenli bir şekilde ayarladım.
Sonuç
Özetle, seçtiğim önbellek yöntemi şu şekildedir:
- Ödemeyle ilgili veriler
- Çok sık okunur ancak güncellenme işlemi nadirdir.
- Gerçekte ödeme yapılmasa bile sorgu yapılan iş mantıklarında önbellek uygulanır.
- Yerel önbellek uygulanmıştır ve TTL 5 saniye olarak ayarlanmıştır.
Bundan sonra yapılacak şey, uygulanan önbellek yönteminin performans testini yapmaktır. Henüz nasıl bir performans testi yapacağım konusunda karar vermedim, bu konuyu daha sonraki gönderilerde ele alacağım!
Yorumlar0