SyncedOutputCache ile Aynı Anda Invalide Olan Output Cache Implementasyonları

By Burak Tungut - 2.3.2016 - Kategori Asp.Net MVC

Selam millet!

Küçük bir ev taşıma, yerleşme arasından sonra tekrar beraberiz. Aslında Elasticsearch ve SOLID konularında ayrı ayrı yazı dizileri başlatmıştım fakat okuyacağınız bu makalede bunlara hiç değinmedim. Geçtiğimiz haftalarda iş yerinde geliştirdiğimiz bir üründe doğan bir ihtiyacımıza karşı bir implementasyon yapmak durumunda kaldık. Size bu tecrübemi aktarmak istiyorum.

OutputCache Şart Oldu

Öyle bir ürün düşünelimki kullanıcı adı ve şifremiz ile authenticate oluyor ve uygulamada gezinmeye başlıyoruz. Fakat öyle sayfalarımız varki içerisindeki sayıların, data'ların uyuşması, tutarlı olması gerekli. Diğer bir yandan ise performans için disk'ler üzerindeki IO'yu düşürmek istiyoruz.

Böyle bir durumda akla Output Cache kullanmak gelebilir. Fakat Asp.Net MVC içerisinde halihazırda var olan OutputCacheAttribute bu ihtiyacımızı tam olarak karşılamayacaktır. Çünkü var olan output cache implementasyonu söz konusu action execute edildikten sonra çalışır. Bu da sayfaların (ya da partial'ların) cache'e alınmış hallerinin aynı anda invalide olmayacağı ihtimali anlamına gelir.

Anlaşılabilir olması için şöyle bir örnek ile ilerleyelim. A sayfamızda sipariş verilmiş ürünlerin sayısı gösterilirken, detayları içeren sayfası sipariş verilmiş olan ürünlerin detayını göstersin. Eğer A ve B sayfaları aynı source'u kullanmıyorsa bu sayfaların output cache'e alınması tutarlı sayıların gösterilmesi yönünde bizi zor duruma sokabilir. Birinin cache'i 3 dakika diğerinin 15 dakika sonra invalide olacağını düşünürsek yeni gelmiş olan kayıtlara ait data ya da sayılar birinde gözükürken diğerinde gözükmeyecektir.

İşte bunun gibi durumları ortadan kaldırabilmek için tüm cache'leri sync hale getirmemiz gerekebilir. Biz bunu yaparken var olan OutputCacheAttribute'ünü inherited etmiş yeni bir sınıf kullanacağız. Amacımız ise x zamanında gelen ve output cache'e alınmak istenen bir request'in x+10 ya da x+60 gibi bir sürede invalida olması değil, bir sonraki 10. ya da 60. (bu sayı bize kalmış, parametrikte olabilir) dakikada invalide olması.

Şöyle bir senaryo düşünebiliriz. A sayfasına 23.03'de girildi ve cache'e alındı. Bu cache'in invalide işlemi 23.10'da yapılmalı. Hal böyleyken 23.07 de dahi B sayfasına girilse burası için yaratılan cache'de 23.10'da invalide olacaktır.

Yani cache'lerimiz sonraki dakika bloğunu tamamlayacak şekilde expire olmalı.

Expire Zamanının Hesaplanması

Şimdi yukarıdaki anlatılan business'a göre expire zamanının hesaplanmasını gerçekleştirelim. Öyle bir method yazmalıyız ki parametre olarak expire edilecek dakikayı almalı (10,15,30 gibi) ve geriye söz konusu cache'in tam olarak hangi zamanda invalide edileceğini bildiren bir değer döndürmeli. Bu değerin DateTime olması daha anlaşılabilir olacağı için aşağıdaki gibi bir method yazabiliriz.

private DateTime GetExpireDateTime(int expirationMinute)
{
    var retVal = DateTime.Now;

    retVal = retVal
        .AddSeconds(retVal.Second * -1)
        .AddMilliseconds(retVal.Millisecond * -1);

    if (expirationMinute == 60)
    {
        retVal = retVal
            .AddHours(1)
            .AddMinutes(retVal.Minute * -1);
    }
    else
    {
        retVal = retVal
            .AddMinutes(expirationMinute - retVal.Minute);
    }

    return retVal;
}

Bu methoda gelecek olan expirationMinute aslında bir expire block niteliği taşıdığı için 60 gelme durumu da söz konusu olacaktır. Örneğin 15. dakikanın katlarında invalide olması istenen sayfalarımız varsa herhangi bir saatin 45. dakikasından sonra gelecek olan bir request sonraki saatin ilk saniyelerinde invalide olmalıdır. Bu nedenle 60 olması durumunda bir sonraki saatin dakika, saniye ve saliselerini siliyoruz.

Devamı

Asp.Net MVC Output Cache Kullanımı ve İstisna Senaryoları

By Burak TUNGUT - 24.3.2013 - 2 Yorum - Kategori Asp.Net MVC

Öncelikle herkese merhabalar smiley Bu makalemde Asp.Net MVC uygulamalarında sıklıkla kullanılan bir önbellekleme yöntemi olan OutputCache filter’ının kullanımını inceliyor olacağız. Web projelerinin en büyük sıkıntıları hiç şüphesiz performans kayıplarıdır. Bunu büyük ölçüde absorbe  etmek içinde doğru yerlerde olma şartıyla caching işlemleri yapılır.Asp.Net MVC Output Cache

Örneğin günde yüzbinlerce kişinin girdiği, hepsiburada.com gibi bir siteyi ele alalım. Kategoriler arasında dolaşıyor, ürünleri inceliyor ve sipariş veriyorsunuz. Ancak hangi sayfada olursanız olun üst tarafta kategorileri hep görüyorsunuz. Yüzbinlerce kişinin bu sitede en az 3 sayfayı gezdiğini bile düşünürseniz kategoriler kısmının her seferinde veri tabanından çekiliyor olması büyük performans kayıpları yaşatacaktır.Sonuçta bu kısım an ve an değişiklik gösterebilen bir bölüm değil. Böyle bir siteye kategori eklenmesi belki birkaç ayda bir gerçekleşir.

Sonuç itibariyle böyle bir durumda yani kısa süreçler içerisinde değişime uğramayan veya anlık bilgi üretmeyen kısımların önbelleklenmesi (caching) büyük ölçüdeki performans kayıplarını bir hayli absorbe edecektir.

Bunun yanı sıra az önce “anlık bilgi üretmeyen…” kısmıyla da belirttiğim gibi durumlarda ise caching yapılması mümkün olup, istenilen sonuçların doğru üretilebilmesi çeşitli konfigürasyonlar ile sağlanabilmektedir.

Caching Çeşitleri

Caching işlemlerini Data Caching ve Output Caching olmak üzere ikiye ayırabiliriz.
Data Cache işlemleri .Net üzerinde, desteklediği tüm veri ve referans tiplerini ön bellekleyebileceğimiz ve her bir istekte ise önbellekten aynı veriyi alabileceğimiz bir model sunar. Böyle bir önbellekleme için yukarıda verdiğimiz örneği ele alırsak, veri tabanına bir kere bağlanılır ve çekilen kategori nesneleri data cache ile ön belleklenebilir.

Makalede inceleyeceğimiz Output Cache modeli ise çıktıların yani render edilmiş View bilgilerinin ön belleklenmesini ve timeout olana kadar gelen her bir istekte ise bir önceki ön belleklenmiş bilgilerin sunulmasını sağlar. Aynı örnek üzerinden ilerleyecek olursak output cache ile kategoriler kısmının ön belleklenmesi için kategoriler kısmını içeren bir PartialView’ın tamamının cache edilmesi gerekir.

Anlık değişim içerisinde olmayan bir çok verinin aynı sayfa üzerinde olacağı durumlarda, toplu bir cache mekanizmasına sahip olduğu için Output Cache kullanımı daha tutarlı bir çözüm olacaktır.

Cache yöntemlerinden ve istisna durumlarından da bahsettiğimize göre artık yapacağımız küçük uygulamalara geçebiliriz laugh

OutputCache kullanım kolaylığı sağlanması için Action Filter sınıfından kalıtılmıştır. Bu sayede Controller veya altında oluşturulabilecek Action’lar için Attribute olarak kullanılabilirler.

OutputCache Attribute'ün Kullanımı

Uygulamalarımızı yapabilmek için bir adet Asp.Net MVC 3 ya da 4 projesi açalım.
HomeController altında GetTime adında bir adet action yaratalım ve aşağıdaki gibi kodlayalım;

namespace MVCAuth.Controllers
{
    public class HomeController : Controller
    {
        [OutputCache(Duration=10)]
        public ActionResult GetTime()
        {
            ViewBag.Date = DateTime.Now.ToString();
            return View();
        }
    }
}

Devamı
1
Facebook
Son Yorumlar