Cache yani önbellek, gelebilecek isteklere daha hızlı hizmet verebilmek için ayrılmış sistemdeki veriler için depolama kapasitesi olarak tanımlanır. Ön bellekte depolanan veriler, sık sık erişilmenin bir sonucu olarak orada depolanır.
Önbelleği teknik olmayan bir örnekle açıklayalım. Bir grup öğrencinin tarih öğretmeni olduğumuzu ve derste Ankara’nın başkent oluşunun tarihini sorduğumuzu varsayalım. Biraz düşündükten sonra öğrencilerden 13 Ekim 1923 cevabını alıyoruz. Bu doğru cevabı aldıktan sonra derse devam ediyoruz. Dersin sonuna doğru, sınıfa başka bir tarih sorumuz olduğunu söyleriz. Soruyu tekrarlarız, Ankara’nın başkent oluşunun tarihi nedir? Bu sefer öğrencilerin saniyeler içinde düşünmeden cevabı söylediklerini görürüz. Bunun sebebi, sorunun daha önce sorulmuş olması sebebiyle yanıtın hatırlanmasının kolay olması (önbelleğe alınmış) ve ikinci kez sorulduğunda cevabın kısa sürede erişilebilir olmasıdır.
Caching yani önbelleğe alma web uygulamalarında genellikle aşağıda belirtilen amaçlar doğrultusunda kullanılır:
Uygulamanın üzerinde çalıştığı sunucudan önbelleğe alınan verilerin sonuçlarını depolar ve alır. Önceki isteklerden veya doğrudan veritabanlarından kopyalanan verileri depolayarak yüksek hızlarda yanıtlar sunmak için uygulamalar ve veritabanları arasında yer alan bir veri depolama katmanıdır.
In-memory cache, disk tabanlı bir veritabanı üzerine kurulu bir uygulamanın, işlemeden önce bir diskten veri alması gerektiğinde performans gecikmelerini ortadan kaldırır.
In memory cache, yalnızca bir sunucudan oluşan küçük veya orta ölçekli uygulamalar için uygundur.
Bellekten veri okumak, diskten okumaktan daha hızlıdır. In memory cache, gecikmeyi önler ve çevrimiçi uygulama performansını iyileştirir. Saatler veya dakikalar süren arka plan işleri artık saniyeler içinde yürütülebilir.
Cache verisi uygulamadan ayrı olduğu için, in-memory cache, verilerin işlenmesi sırasında cache sisteminden uygulamaya ve sonra tekrar cache sistemine taşınmasını gerektirir. Bu süreç genellikle ağlar arasında gerçekleşir.
Peki in-memory cache kullanmanın dezavantajı nedir?
In-memory cache kullanmanın dezavantajı ise bu yöntemi kullanan bir sunucunun yeniden başlatılması veya çökmesi halinde verilerın kaybolması ile ortaya çıkar (bir sunucu olması durumunda). Bu durum, üretim aşamasında kabul edilemez bir hataya yol açabilir. Birden fazla sunucunun olması veya sunucunun bir web-farm’ın bir parçası olması durumunda da verilere başka bir sunucudan erişimde problemler ortaya çıkabilir.
Burada web-farm kavramında biraz bahsetmekte fayda var. Web-farm, aynı platforma hizmet eden servis ve sunucular bütünüdür. Bir başka tanımla, birden fazla client için birden fazla web sunucusunun bulunduğu bir web hosting (barındırma) sistemidir. Web-farmların kullanım nedeni, trafiği önlemek ve kaynakların tüm istemciler için sorunsuz bir şekilde kullanılabilir olmasını sağlamaktır. Bu nedenle, bir web farm, yükü aralarında dağıtmak için birden fazla web sunucusunda tek bir web uygulamasını barındırırken kullanılmaktadır.
Web-farm’ın özelliklerinden de kısaca bahsecek olursak:
Aynı ağ içindeki birden çok düğüm veya sunucu arasında yapılandırılmış ve benzer veri isteği bilgilerini depolayan önbelleğe alma depolamasıdır. Önbellek belirli bir sunucunun belleğinde bulunmaz, bunun yerine önbelleğe alınmış verileri depolamak için başka düğümler (node) kullanılabilir. Dağıtılmış önbelleği depolamak için düğüm örneklerine SQL server veritabanı, Azure Cache for Redis, NCache gösterilebilir. Böylece her sunucunun önbelleğe erişimi olacak ve sunucunun yeniden başlatılma veya hatta çökse durumunda bile önbelleğe alınan veriler kaybolmamış olacaktır.
Google Cloud, public bulut platformunda verileri önbelleğe almak için Memcache’i kullanır. Redis, internet devleri tarafından önbelleğe alma, NoSQL veri deposu ve diğer birçok kullanım durumu için kullanılır.
Ölçeklendirme potansiyeline sahip olması ve yüksek oranda erişilebilirlik (high availability) distributed cache için tercih nedenidir. Ölçeklenebilirlik, yüksek oranda erişilebilir olma, hata toleransı gibi özellikler günümüzde çevrimiçi olarak çalışan büyük ölçekli hizmetler için çok önemlidir. Kuruluşlar, servislerinin çevrimdışına alınmasını göze alamaz. Sağlık hizmetlerini, borsaları, orduyu düşünün. Bu hizmetlerin/servislerin çökme lüksü yoktur. Sadece cache yapısı değil, aynı zamanda dağıtılmış önbellek de bulut bilişim için tercih sebebidir.
Önbellek stratejileri veritabanının ne sıklıkta güncellendiğine ve tutarlılığın hızdan daha büyük bir sorun olup olmadığına bağlı olarak seçilebilir.
Standart ve basit önbelleğe alma stratejisidir. Uygulama, veri alma performansını artırmak için istek üzerine veritabanı verilerini tembel olarak yükler (lazy loading). Lazy loading; bir web sayfasının ya da uygulamanın belirli bölümlerinin, özellikle de görsellerin ihtiyaç duyulana kadar yüklenmesini beklemek için kullanılan bir yöntemdir.
Bu yaklaşımda, uygulama önce verileri önbellekten ister. Önbellekte veri varsa, uygulama önbellekten bilgileri alır. Veriler önbellekte değilse, uygulama veri deposundaki verileri okur ve daha sonra kullanmak üzere önbelleğe ekler veya önbelleği günceller.
Read-through yani baştan sona okuma, cache aside yaklaşımına benzer bir lazy loading yaklaşımıdır. Ancak, cache aside’a benzemeyen bir özelliği vardır; veri deposundan habersizdir. Bu nedenle veritabanını, önbelleğe alma mekanizması ile sorgular. Veritabanı uygulamalarını, cache bileşenine devrederek uygulama kodunun temiz hale gelmesini sağlar. Ancak bu, veritabanı kimlik bilgileri için fazladan önbelleğe alma bileşenleri yapılandırılmasına sebep olur.
Write through yani baştan sona yazma, uygulamanın veritabanı işlemlerini önbelleğe devrettiği bir önbelleğe alma yaklaşımıdır. Read through cach’e benzer bir yaklaşımdır.
Uygulama, önbelleği günceller ve ardından verileri senkronize olarak veritabanına yazar. Bu işlem yazma işlemini yavaşlatır ancak önbellek tutarlılığı ve güvenilirliği sağlar. Geliştiriciler, tutarlılık önemli bir sorun olduğunda ve uygulama önbelleğe sık veri yazmadığında bu yaklaşımı kullanır.
Sistemler doğası gereği ölçeklendirilmek üzere dağıtılmış olarak tasarlanmıştır. Hesaplama yapma, depolama kapasitesine sahip olma gibi güçlerini anında artırabilecek şekilde tasarlanmıştır. Aynı şey dağıtılmış önbellek için de geçerlidir. Geleneksel önbellek birkaç örnekte barındırılır ve bunun bir sınırı vardır. Anında ölçeklendirmek zordur. Dağıtılmış önbellek tasarımına kıyasla çok fazla kullanılabilir ve hataya dayanıklı değildir.
Özetle; cache yani önbellek, gelebilecek isteklere daha hızlı hizmet verebilmek için ayrılmış sistemdeki veriler için depolama kapasitesi olarak tanımlanır. Distributed cache, aynı ağ içindeki birden çok düğüm veya sunucu arasında yapılandırılmış ve benzer veri isteği bilgilerini depolayan önbelleğe alma depolamasıdır. In-Memory Cache: uygulamanın üzerinde çalıştığı sunucudan önbelleğe alınan verilerin sonuçlarını depolar ve alır.
Kaynaklar
AWS, Caching overview
tutorails point, Cache management
Redis, Redis Enterprise: the high-performance caching solution
Wikipedia, Distributed cache
Miuul Not Defteri, Koç E., Lazy loading vs eager loading