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

0 dakikada yazıldı

32400 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 ;)