Günümüzde özellikle her ölçekten uygulamaların web siteleri ya da mobil uygulamalar üzerine taşınması ile birlikte doğrudan sorun olarak görülmeyen ancak performans ve maliyet açısından sıkıntı oluşturabilecek durumlar ortaya çıkmaya başlamıştır. Özellikle yüksek trafik maliyeti ve kullanıcı deneyimi açısından çok sık ziyaret edilen servislerde yaşanabilecek yavaş cevap süresi bu durumlara verilebilecek örnekler olabilir.

Bu tarz performansa ve kullanıcı deneyimine doğrudan etki eden durumlar için ortaya konan bir çözüm olarak Caching’i ele alacağız.

Caching Nedir?

Caching, özellikle sık kullanılan verilerin sistemden talep edilmesi durumunda veri kaynağı üzerinde tekrar tekrar bir sorgulama işlemi yapılmaksınız istekte bulunan kullanıcıya hızlı ve efektif bir şekilde sunulmasını sağlayan yapıdır.

Burada dikkat edilmesi gereken ilk konu hangi verilerin önbelleğe alınacağıdır. Netice itibari ile kullanıcılara sunacağımız verinin tutarlı bir sonuç doğurması gerekmektedir. Örneğin sistemimizde her dakika değeri değişen bir veri seti varsa ve bunu uzun süreli olarak önbelleğe kaydediyorsak, istekte bulunan kullanıcılara hatalı ya da artık geçerliliği olmayan bir veri setini cevap olarak dönmüş olmamız muhtemel olacaktır. Aynı şekilde cache yapısı da sistem üzerinde bir kaynak tüketiminde bulunacağı için çok az istekte bulunulan sistemler üzerinde bir caching uygulamak gereksiz kaynak tüketimine sebep olacaktır. Bu yüzden cache yapısı kurgulamak adına ele alınacak en doğru veri seti, çok sık ziyaret edilen ancak çok nadir değiştirilen verileri içermelidir.

Verilen bilgilerden yola çıkarak, tutarlı bir şekilde kurgulanmış bir cache yönetiminin sistemin kullanıcıya cevap verme hızına doğrudan bir katkısı olduğunu söyleyebiliriz. Ayrıca bu sayede gereksiz yüksek trafik maliyeti de kontrol altına alınırken, sistemin çok sayıda istek alması durumunda da performansı önemli ölçüde artacaktır.

Cache Yöntemleri

Caching, In-Memory Caching ya da Distributed Caching olmak üzere iki farklı yöntem ile kurgulanabilir.

Ayrıca bu yöntemlere ek olarak bir verinin hangi anda önbelleğe alınacağı ile ilgili de iki farklı durum söz konusudur. Bunlar;

Prepopulation: Herhangi bir istekten bağımsız olarak önbelleğe alınması kurgulanmış verilerin uygulama çalıştığı anda kurgulanan yapıya uygun olarak kaydedildiği durumu temsil eder.

On-Demand: Önbelleğe alınması kurgulanmış veriye bir istekte bulunulduğunda verinin kurgulanan yapıya uygun olarak kaydedildiği durumu temsil eder.

In-Memory Caching

Private Caching şeklinde de isimlendirilebilir. Bu yöntemde önbelleğe alınan veri, doğrudan uygulamanın üzerinde çalıştığı sunucunun RAM’inde tutulur. Bu sayede gelen isteklere karşın cevap süresi çok kısadır. Ancak kendisine has sorunları beraberinde getirir.

Örneğin, uygulamamız birden fazla instance içeriyor ve gelen istek bir load balancer ile dengeleniyorsa her instance kendi içerisinde değişken olduğu kabul edilen verinin farklı bir halini önbelleğe almış olabilir. Bu noktada bir kullanıcı isteğini arka arkaya birkaç kere yinelediğinde load balancer tarafından farklı instancelara yönlendirilebilir ve cevap olarak sürekli farklı bir veri setini dönüt alabilir. Buna karşın Sticky Session özelliği kullanılsa dahi aynı uygulama farklı instancelarda farklı veriyi önbelleğe aldığı için yine de tutarlı bir sonuç ortaya koymayacaktır.

Distributed Caching

Shared Caching ya da Public Caching şeklinde de isimlendirilebilir. In-Memory Caching’e göre tamamen farklı bir şekilde, önbelleğe alınan veri uygulamanın üzerinde çalıştığı sunucunun RAM’i yerine tamamen farklı bir cache servisi üzerinde tutulur. Bu yöntemde kullanıcılar sisteme bir istekte bulunduğunda veri cache yapısı üzerinden dönüt olarak verilecek olsa bile cache servisine bir istekte bulunulması gerektiği için hız noktasında In-Memory Cache’e göre yavaş kalabilmektedir. Ancak buna karşın tek bir cache servisi ile kurgulandığı için önbelleğe alınmış veri setleri tamamen tutarlı bir sonuç doğuracaktır.

Ayrıca bu yöntemde ele alınan cache yapısı ayrı bir servis olduğundan ötürü, uygulama sunucusu üzerinde yaşanabilecek herhangi bir sorundan etkilenmeyecek ve cache yapısı taşımakta olduğu veriler ile birlikte sorunsuzca çalışmaya devam edebilecektir.

Cache Süresi Ve Yönetimi

Caching yapısına dahil edilmiş bir veri, sonsuza kadar cache yapısı içerisinde saklı tutulmaz. Bunun için uygulamanın yapısına uygun bir süreç belirlemek gerekir. Burada iki farklı durum söz konusudur.

Herhangi bir veriyi önbelleğe aldığımızda doğrudan cache yapısında tutulması için geçerli sabit bir süre belirtebiliriz. Örneğin, “x verisi 30 dakika boyunca önbellekte tutulsun ve sonra silinsin.” şeklinde bir senaryo kurgularsak eğer burada belirtilen süre Absolute Time olarak isimlendirilebilir.

Burada ikinci durum ise cache yapısı içerisinde tutulan veriyi içeren bir istek geldikçe var olan cache süresini, belirtilen sabit bir süre kadar uzatmaktan geçen bir yöntemdir. Örneğin, “önbellekte bulunan x verisine her istek geldiğinde, cache yapısında tutulma süresi 5 dakika uzasın.” şeklinde bir kurgu oluşturulabilir. Bu süre yönetimini ise Sliding Time olarak isimlendirilebilir. Ancak burada dikkat edilmesi gereken bir durum vardır. Eğer sliding time ile bir süre yönetimi yapacaksak, çok fazla istek alan bir veri seti asla cache yapısından silinmeyebilir. Bu durumda normal şartlarda veri güncellense bile hala cache yapısı içerisinde verinin çok eski bir versiyonunun tutulması mümkündür. Bu sebeple sliding time ile bir kurgu gerçekleştirilse bile nihai bir silinme zamanı için absolute time’da belirtilmelidir. Yani tutarlı bir kurgu için, “önbellekte bulunan x verisine her istek geldiğinde, cache yapısı içerisinde tutulma süresi 5 dakika uzasın. Ancak ne olursa olsun x verisi cache yapısında maksimum 1 saat barınabilsin.” şeklinde bir senaryo daha doğru olacaktır.

Okuyanlara faydası olması dileğiyle. İyi çalışmalar.