In-memory ile distributed cache management kavramlarının karşılaştırılması...

In-memory ile distributed cache management kavramlarının karşılaştırılması

Bu yazımızda, hızlı erişim ve ölçeklenebilirlik arasındaki hassas dengeyi bulmak için in-memory ve distributed cache yönetim sistemlerini karşılaştırıyoruz.
Elif Koç20 Kas 2023

 

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:
 

  • Uygulama gecikmesini azaltır. Basitçe, RAM’de depolanan tüm sık erişilen verilere sahip olması nedeniyle, kullanıcı verileri istediğinde uygulamanın sabit diskle iletişim kurması gerekmez. Bu, uygulamanın yanıt sürelerini daha hızlı hale getirir. 
  • İkincisi, veritabanına gitmeden önce tüm kullanıcı veri isteklerini durdurur. Bu veritabanı darboğaz (bottleneck) sorununu önler. Bottleneck; birden fazla farklı parçadan oluşan bir sistemde, bütünün performansını veya kapasitesini sınırlayan bir parçanın ismidir.
  • Önbelleğe alma, uygulama çalıştırma maliyetlerini düşürmede genellikle kullanışlıdır. Önbelleğe alma; bir veritabanı, CDN, DNS vb. gibi web uygulama mimarisinin her katmanında kullanılabilir.

 

In-memory cache: 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:

 

  • Web-farm’lar birden fazla bilgisayardan oluşur.
  • Birden çok sunucuda çalışma yeteneğine sahiptir. Bu, web uygulamalarına fiziksel ölçeklenebilirlik sağlar.
  • Web-farm, bazı durumlarda performansı arttırmaya yardımcı olur. 
  • Bir web-farm, birden çok web sunucusunu gruplandırmak için bir load balancer kullanır. Load Balancer: uygulama kullanılabilirliğini iyileştirmek ve aşırı yüklenmeyi önlemek için trafiği birden çok sunucu arasında dağıtan bir ağ çözümüdü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. Ö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.

 

Önbelleğe alma yaklaşımları
 

Ö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.
 

Cache aside: 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: 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: 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. 

 

Dağıtık önbelleğe alma ile geleneksel önbelleğe almanın karşılaştırması
 

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

 

İlginizi Çekebilir
Miuul topluluğunun bir parçası ol!

Abone ol butonuna tıklayarak Miuul'dan pazarlama ve haber içerikleri almayı onaylıyorum.