ASP.NET Çalışma Zamanında Output Compression

0 dakikada yazıldı

32189 defa okundu

Düzenle

Blogu yazarken kullandığım bir ufak taktiği daha sizlerle paylaşmak istiyorum :) Özellikle blogun arama ve arşiv kısımlarında süper işime yarayan bu taktik IIS'ten response'un sıkıştırılarak gönderilmesi. Konuya geçmeden önce sizden blogunarama vearşiv kısımlarını bir ziyaret etmenizi istiyorum. Sayfaların açılış hızından tutun özellikle arama kısmındaki aramanın hızına kadar sanırım tüm bu performans öğeleri dikkatinizi çekecektir. Sayfaların hızlı açılması adına birer günlük output caching koyduğumu itiraf etmem gerek. Bu bölümlerde blogun son bir günündeki değişikliklerin yansımamasını göze alarak böyle bir caching stratejisinin doğru olacağını düşündüm.

[HTML]

        \<%@ OutputCache Duration="86400" VaryByParam="lang" %>\

Konumuz olmasa da yukarıdaki ayarlama hemen bir paylaşiyim istedim. Bu arada unutmadan VaryByParam cachlemenin bir değişkene göre farklılaştırılabilmesini sağlıyor. Örneğin benim blogda İngilizce ve Türkçe sayfalarda arama sayfaları aslında aynı sadece URLReWriting üzerinden gelen Lang parametresine göre sayfa kendisini şekillendiriyor. Bu parametreye göre iki farklı cache alınıp kullanılabilmesi için VaryByParam'ı da set edebiliyoruz. Bu kısa Cache hatırlatmasından sonra gelelim esas meseleye,arama sayfası.

gzip veya deflate

Hem arama hem de arşiv sayfasında sayfanın outputu çok büyük. Arşiv sayfasında tüm makaleler ve linkleri olduğu için HTML çok şişti. Arama sayfasında ise başka bir nedenle şişme oldu :) O neden ne mi? Bloga arama özelliğini eklerken düşündüm ve aslında postların başlıkları ve tagleri dışında bir aramanın gerekmediğini düşündüm. Yani postların metinlerinin içinde bir arama çok anlamlı değil. Sonrasında aklıma gelen fikir şu oldu; acaba dedim 3000 tane postun başlıkları ile taglerini direk sayfa ilk açılışında JSON olarak outputa eklesem sayfa çok mu şişer? Düşündüğüm şey herşeyi sayfa ilk açılırken içine eklemek sonra da arama işleminini tamamen JavaScript ile istemcide yapmaktı. Böylece süper bir performans elde edecektim. Yaptığım testlerde 3000 makalenin başlık ve tag bilgilerinin ortalam 120 KB tuttuğunu gördüm. Ortalama bir ADSL bağlantısında bunun 1sn'de download olacağını düşünürsek aslında uzun bir süre sayılmaz ama yine de plain-text bir içeriği böyle bulk göndermek söz konusu olunca bunu ziplesem ne olur diye düşünmeye başladım ve....

[VB]

        Public Shared Sub GZipEncodePage()\             If IsGZipSupported() Then\                 Dim Response As HttpResponse = HttpContext.Current.Response\ \                 Dim AcceptEncoding As String = HttpContext.Current.Request.Headers("Accept-Encoding")\                 If AcceptEncoding.Contains("gzip"Then\                     Response.Filter = New System.IO.Compression.GZipStream(\                         Response.Filter, System.IO.Compression.CompressionMode.Compress)\                     Response.AppendHeader("Content-Encoding""gzip")\                 Else\                     Response.Filter = New System.IO.Compression.DeflateStream(\                         Response.Filter, System.IO.Compression.CompressionMode.Compress)\                     Response.AppendHeader("Content-Encoding""deflate")\                 End If\             End If\         End Sub

İşte ortaya yukarıdaki kod çıktı. Bu kod ilk olarak sayfayı açan istemcininEncoding destekleyip desteklemediğine göz atıyor. Sonra da desteklenen encoding seçeneğine göre uygun gzip veya deflate encoding'i kullanıyor. Bu teknik sunucunuzun durumuna göre hafiften ek yük yaratabilir. Özellikle dinamik sayfaları sürekli zipliyor olmak tabi ki request yükünü etkileyecektir. Fakat benim senaryomdaki gibi zaten günlük cachelenen bir içeriği ziplemenin hiçbir zararı olmaz. Sözün özü 120 KB'lık output 30KB civarına indi. Özetle 35 KB'lık bir arama sayfası 3000 makalenin başlık ve taglerini de download etmiş şekilde istemciye gönderiliyor. Hiç fena değil!

gzip ve deflate gibi output compression site genelinde IIS'ten de ayarlanabilir ama sitenizin yüküne göre çalışma zamanında kapatıp açmak veya sayfa bazında kapatıp açmak isterseniz yukarıdaki kod işinizi görecektir.

Hepinize kolay gelsin ;)