Önbellekleme (Caching) : Terminoloji
Önbellekleme hakkında bilinmesi gereken terimler
You can access the English version via this link.
Yazılım geliştirme sürecinin mühendislik alanına atıfta bulunan taraflarından biri kaynakların etkin kullanılmasıdır. Sınırlı kaynak kullanarak kullanıcılara kaliteli bir hizmet vermek hedeflenir. Bu amaca ulaşmak için de kullanabilecek tekniklerin başında önbellekleme (caching) gelmektedir.
Bu yazıda ‘önbellekleme nasıl yapılır’ ve ‘ne gibi araçlar kullanılır’ konusuna geçmeden önce önbelleklemeyle alakalı terimlerden bahsedeceğiz.
Önbellekleme Nedir?
Önbellekleme verinin asıl kaynağı yerine daha hızlı erişim yapılabilecek bir yerde saklanması ve oradan okunması anlamına gelmektedir.
Zihnimizde daha iyi canlanması için şöyle bir örnek kullanabiliriz: Marketteki ve evimizdeki buzdolaplarını düşünelim. Malzemeye ihtiyaç duydukça markete gidip gelmek zor olacağı için bazı malzemeleri evimizde buzdolabında saklarız. Bu senaryoda market verinin asıl kaynağı, evimizdeki buzdolabı ise önbellek alanımızı temsil etmiş olacaktır.
Önbellek alanında ihtiyacımız olan veriyi bulduğumuz duruma Cache Hit denilmektedir. Veriyi bulamadığımız durumsa Cache Miss olarak isimlendirilmektedir.
Önbelleklemenin Avantajları Nelerdir?
Önbellekleme işlemini verinin daha hızlı erişilebileceği bir yerden okumak olarak tanımlamıştık. Bu tanımdan yola çıkarak ilk avantajın cevap sürelerinin (response time) kısalması olduğu sonucuna varabiliriz. Bir kişi sizden su istediği zaman dolaptan alıp getirmekle, markete gidip su alıp getirmek arasında bir zaman farkı olacağı aşikardır.
Ağ trafiğinin (network traffic) azalmasını da avantajlar arasında sayabiliriz. İstemci tarafında önbellekleme yapıldıysa sunucu tarafına veya sunucu tarafında önbellekleme yapıldıysa veri saklama ortamına (veri tabanı, dosya sistemi vb.) istek atmaya gerek kalmayacaktır. Kimsenin evinde yiyecek, içecek ve temizlik malzemesi gibi ürünleri bulundurmadığını düşünelim. İhtiyaç oldukça herkes marketlere gidiyor olsun. Bu senaryoda marketlere giden yollar ne kadar çok yoğun olurdu değil mi?
Maliyet azaltmak bir diğer avantaj olarak sıralanabilir. Önbellekleme sayesinde sunucu ve veri tabanı gibi kaynaklara daha az yük düşecektir. Bu sayede de daha düşük güce sahip makinalar kullanarak veya aynı makinaları daha kısa sürelerde çalıştırarak işlemlerimizi gerçekleştirebiliriz.
Planlı veya planlı olmayan bazı durumlar sebebiyle verinin ana kaynağına erişemediğimiz zamanlar olabilir. Verinin ana kaynağına erişemediğimiz durumlarda önbellekte yer alan verilerle bir süre daha hizmet vermeyi sağlayabiliriz. Bu sayede çalışma süresini (uptime) uzatarak kullanıcıları aksaklıklara karşı bir miktar daha korumuş oluruz.
İlk akla gelen önemli avantajları saymaya çalıştım. Daha birçok avantaj sayılabilir ama konuyu çok da uzatmamak için dezavantajlara geçmenin vakti geldi diye düşünüyorum :)
Önbelleklemenin Dezavantajları Nelerdir?
Verilere daha hızlı erişebileceğimiz bir ortamdan kopyalarını istemciye iletmemiz önbelleklemenin temel mantığıdır. Bu temel mantık verinin asıl kaynakta değişmesine karşılık, istemciye eski kopyasının önbellekten verilmesi gibi bir soruna sebep olmaktadır. Önbelleklemeyle alakalı en büyük dezavantaj işte bu; geçersiz verilerin kullanıcıya sunulması durumudur.
Bir diğer dezavantajı ise şu şekilde açıklayabiliriz. Evinizdeki buzdolabına gittiğinizi ve aradığınızı bulamadığınızı düşünün. Bu durumda hazırlanıp markete gitmeniz gerekecektir. Önbellekte arama yaparken geçirdiğiniz zaman ise cevap verme sürensinin uzaması anlamına gelecektir.
Bunların dışında önbellekleme işlemi için bir araç kullanırsanız (redis, memcache, etc) bu araçların bakım maliyetleri olacaktır.
Bunun yanı sıra buzdolabını doldurmak, tarihi geçen ürünleri dolaptan çıkarmak, buzdolabı çok dolduysa bazı ürünlerden feragat edip dolabınızda yer açmak gibi düşünmeniz gereken konular ortaya çıkacaktır.
Önbellekleme Stratejileri Nelerdir?
Verilerin hangi aşamada önbellekleneceğine dair iki ana yaklaşım vardır. Bu yöntemlerden biri ihtiyaç anında veriyi önbelleğe almaktır. Bir diğer yöntem ise henüz ihtiyaç duymadan önbellek alanına verinin kaydını yapmaktır.
İhtiyaç Anında (On-demand | Pulling)
Veriye ilk erişim yaptığımız anda (Cache Miss durumuyla beraber) asıl veri kaynağından verinin elde edilip önbellek alanına yazılmasına dayanan bir yöntemdir.
Bu yöntemin kötü yanı veriye ilk defa erişmek istediğimiz zaman erişim yavaş olacaktır. Yöntemin güzel yanı ise önbellekleme alanını olabildiğince küçük boyutlarda tutabilmektir.
Online oyun sistemi kurguladığınızı düşünün. Milyonlarca kullanıcınız olabilir. Kullanıcı sisteme girmese bile, bilgilerini önbellekte saklamak gereksiz bir maliyet yaratacaktır. Bu yöntem yerine kullanıcı sisteme giriş yaparken kullanıcı bilgisine ilk ihtiyaç duyulan anda, bilgileri önbelleğe koymak kaynakları verimli kullanmak adına daha akılcı görünmektedir. Bu yöntem verinin çok olduğu senaryolarda sıklıkla tercih edilebilir.
Not: Write-Around önbellekleme yöntemi ihtiyaç anında önbellekleme tipidir.
İhtiyaç Öncesi (Prepopulating | Pushing)
Veriye henüz erişim olmadan, verinin kullanılacağını tahmin ederek, önbellek alanına yazılması prensibine dayanmaktadır.
Bu yöntemin avantajı verinin kullanılacağı tahmin edilerek, verinin önceden önbellek alanına yazılması ve bu sayede veriye ilk erişimin hızlı olmasıdır. Cache-Miss durumunun yaratacağı cezalardan kurtulmaktayız. Veriye erişilmediği durumda gereksiz yere önbellek alanını kullanmış olmamızı ise dezavantaj olarak sayabiliriz.
Sipariş sistemi kurguladığımızı düşünelim. Yeni bir sipariş oluştuğu zaman, bu siparişe ait bilgilere erişecek farklı sistemler olabilir (kargolama servisi, faturalama servisi vb.). Kullanıcı da siparişinin son durumunu öğrenmek için ara sıra sipariş detayına erişmek isteyebilir. Bu senaryoda yeni oluşmuş siparişlerin sorgulanacağını öngörerek sipariş bilgisine henüz erişim olmadan önbellek alanına yazmak iyi bir çözüm olabilir.
Not: Verinin asıl kaynağa ve önbellek alanına yazılması işleminin bir bütün olarak ele alındığı yaklaşıma Write-Through adı verilmektedir. Verinin sadece önbellek alanına kaydedilerek sürecin tamamlandığının düşünüldüğü yönteme Write-Back adı verilmektedir. Write-Back yönteminde, süreç tamamlanması sonucu, veri asıl veri kaynağına kopyalanmaktadır. Bu iki yöntemde de veri henüz ihtiyaç olmadan önbellek alanına kaydedilmektedir.
Saklama Yerine Göre Önbellek Tipleri
Bu bölümde bellek içi ve dağıtık olarak iki farklı önbellekleme tipini, artılarını ve eksilerini konuşacağız.
Bellek İçi (In-Memory) Önbellekleme
Önbellekleme alanı olarak uygulamanın çalıştığı makinadaki bellek alanının seçildiği duruma verilen isimdir.
Bu yöntemin en büyük artısı bellek erişiminin çok hızlı olmasıdır. Herhangi bir ağ (network) erişimine gerek olmadan veriye erişilebilir. Ayrıca farklı bir araç olmadığı için ek bir bakım maliyeti de oluşmamış olur.
Birden fazla makinada uygulamanın çalıştırıldığı senaryolarda bu yöntemin olumsuz taraflarını görmeye başlamaktayız. Makina-X üzerinde işlem yürütülürken verinin kopyasını asıl kaynaktan alıp sakladığımızı düşünelim. Aynı veriye Makina-Y ihtiyaç duyduğu zaman asıl veri kaynağına bir kere daha istek gidecektir. Bu makina da verinin kopyasını kendi belleğinde saklayacaktır. Bu işlem veriye ihtiyaç duyan her makina için gerçekleşecektir.
Bir diğer sorun ise farklı makinaların belleklerinde saklanan kopyaların verinin farklı versiyonları olabilmesidir. Makina-X sipariş durumunu sorgulayıp ‘Hazırlanıyor’ olarak görüp bellek alanına yazabilir. Ardından Makina-Y aynı siparişi sorgulayıp ‘Yolda’ olarak bellek alanına kaydedebilir. Bu durumda istemci uygulama, sorgulama yaptığı makinaya göre farklı sonuçlarla karşılaşabilir.
Dağıtık (Distributed) Önbellekleme
Bu yöntemde önbellekleme hizmetini farklı bir uygulama/araç verir. Bu sayede uygulamalar önbellekleme ihtiyaçlarını ortak bir servis üzerinden giderirler.
Bu yöntemin artısı ortak bir servis üzerinden hizmet alınması sayesinde, Makina-X ve Makina-Y için önbellekte yer alan verilerin aynı olmasıdır. Önceki örneği düşünürsek, istemci sipariş durumunu sorgularken istek hangi makina tarafından karşılanırsa karşılansın cevap aynı olacaktır.
Bir diğer olumlu durum da şudur; Makina-X aracılığı ile verinin önbelleklenmesi sağlandıktan sonra, Makina-Y veri kaynağına sorgu atılmasına sebep olmaz. Veri kaynağına giden sorgu sayısının azaltılması noktasında bu yöntem daha etkilidir.
Bellek içi yönteminin pozitif yönlerini bu yöntemde kaybetmiş oluyoruz. Daha açık bir ifadeyle; önbellek alanının sorgulanması için ağ çağrısı yapmak, önbellekleme işlemini yürüten uygulamanın/aracın bakım maliyetine katlanmak bu yöntemin olumsuz taraflarıdır.
Veri Yaşam Süresi (Invalidation)
Önbelleğe alınan veriye bir ömür biçebiliriz. Bu şekilde önbelleğe alınan bir verinin sonsuza kadar orada kalmasının önüne geçeriz.
Kesin Süreli (Absolute Time)
Bu stratejide, veri önbelleğe alınırken X süre sonra bu veri önbellekten temizlenecek şeklinde bir karar verilir. Belirlenen süre dolduğu zaman veriler geçersiz hale gelir ve önbellek alanından silinir.
Kayan Pencere (Sliding Window)
Kayan pencere stratejisi kullanıldığı zaman veri önbelleğe alınırken X süre önbellekte kalacak şeklinde bir karar verilir. Veriye erişim sağlanıldığı zaman ise verinin ömrü uzatılır.
Not: Bu yöntemde veriye sürekli erişim olduğu senaryoda verinin ömrü sürekli uzatılır. Orijinal veride güncelleme olduğu zaman önbellek alanında yer alan veri değiştirilmiyorsa, bu senaryoda teorik olarak sonsuza kadar kullanıcıya eski veriyi verme olasılığı ortaya çıkar.
Veri Silme Prosedürleri (Eviction)
Önbellek alanı dolduğu zaman kaydetmek istediğiniz yeni verilere yer açmanız gerekecektir. Bu durumlar için farklı prosedürler belirlenmiştir. Bu bölümde bu prosedürlerden kısaca bahsedeceğiz.
Uzun Zamandır Erişilmeyeni Sil (Least Recently Used | LRU)
Bu yöntemde önbellek alanına saklanan veriye en son ne zaman erişildiğine dair bilgi tutulur. Önbellek alanında yer açmak için silme işlemi tetiklendiği zaman erişim tarihi eski olandan başlayarak silme işlemi gerçekleştirilir.
Uzun zamandır kullanılmıyorsa bir süre daha kullanılmayacağı varsayımına sahipsek bu yöntem kullanılabilir.
En Yakın Zamanda Erişileni Sil (Most Recently Used | MRU)
Bu yöntemde önbellek alanına saklanan veriye en son ne zaman erişildiğine dair bilgi tutulur. Önbellek alanında yer açmak için silme işlemi tetiklendiği zaman erişim tarihi en yeni olandan başlayarak silme işlemi gerçekleştirilir.
Yakın zamanda erişim sağlanan verinin bir daha kısa vadede sorgulanmayacağını, uzun zamandır erişilmeyen için ise yakın zamanda bir erişim talebine maruz kalacağını düşündüğümüz senaryolarda kullanılması uygundur.
En Az Erişim Olanı Sil (Least Frequently Used | LFU)
Bu yöntemde önbellek alanında veriye en son ne zaman erişildiği verisi yerine kaç defa erişildiği gibi bir değer tutulur. Bu sayede önbellek alanı temizliği işlemi başladığı zaman en seyrek erişim yapılan veriden başlanarak silme işlemi ilerler.
Konumlarına Göre Önbellekleme Tipleri
İstemci Taraflı Önbellekleme (Client-Side)
Bu durumda istemci bazlı önbellek alanından bahsetmekteyiz. Her istemci ihtiyacı olan verileri kendi erişimi olan bir önbellek alanına yazar. Hizmet sağlayıcıya isteğini iletmeden kendi sakladığı verilerle işlemini ilerletmeye çalışır.
Hizmet Sağlayıcı Taraflı Önbellekleme (Server-Side)
Bu senaryoda ise hizmet sağlayıcı kendi önbellek alanını yönetmektedir. İstemciler isteklerini hizmet sağlayıcıya iletir ve hizmet sağlayıcı cevap oluşturmak için gereken verileri kendi önbellek alanında arar. Önbellek alanının yönetimi ortak bir noktada (hizmet sağlayıcının sorumluluğu altında) olur.
Önbellekleme ile alakalı bilinmesi gereken temel terimler hakkında konuşmuş olduk. Umarım yararlı bir yazı olmuştur. Diğer yazılarıma göz atmak için bu linke tıklayabilirsiniz.