Perşembe, Haziran 21, 2007

Read-ahead

ajax'in en guzel yanlarindan biri, browser sanki server'a hic istekte bulunmuyormu$ ta, hersey hazir localdeymis hissi vermesidir. Ornegin gmail'de bir mail okumak icin tikladigim da aninda mailin iceriginin kar$ima gelmesi. Bu hissi yaratmanin yontemlerinden birisi, sayfa yuklenmeden, butun datalari XML/Json olarak XHR request ile serverdan almaktir, daha sonra JS ile sayfayi 'cizmek'tir. Bu yontemi Ortak Mesaj projesinde uygulanmi$tik. Ancak beni sinirlendiren bir cok negativ etkisi vardi bu yontemin (bu yonler ba$li ba$ina ayri bir post konusu olacak kadar coktur, o yuzden pek bahsetmeden geciyorum). Sadece cok ki$i tarafindan kufur edilen bir ozellikten bahsedecegim, o da sayfanin acilmadan butun datayi cekmesinden kaynaklanan inanilmaz bekleme ve cok kullanici ile abanildiginda, kullanicilarin time-out'lardan $ikayetci olmasi. Sayfa bir kere yuklendikten sonra kullanmasi cok rahat ve hizli oluyor, ancak, sayfa yuklenene kadar agac oluyormu$sunuz hissine kapilmamak elde degil. Bunu ya$amamak icin yapilmasi gerek yontem, sayfada sadece acili$ta gorunen datayi server istemek, daha sonra arka planda sayfanin geri kalani icin gerekli olan datalari cekmek. pmAQ'deki read-ahead teknigi ise takriben
bunu yapiyor. Data server'dan JSON olarak alinmiyor, direkt HTML olarak request edilip, URLe gore cache'leniyor. Server'a ilk giden istek, kullanicinin login oldugunu varsayarak, ilk 10 tane ticket listesi olsun. Bu istegin cevabi geldikten sonra, arka planda, geri kalan ticket listesi sayfalari istekleri gonderiliyor ve cevaplari geldikce Javascript tarafinda cacheleniyor. Daha sonra kullanici, 'sonraki sayfa' linkine bastigi anda, o sayfa hazir cachede bulundugu icin, direkt olarak DOM'un icine gomuluyor. Tabii ki bu arada soyle bir soru gelebilir:

"kullanici henuz cevap gelmemi$ bir sayfaya gitmek isterse ne oluyor?"

i$te orada o super ajax kivamindan cikiliyor ve normal bir web 1.0 uygulamasi kullaniliyormus hissine kapiliyor. Fakat bi kere gelen cevap, cache'lendigi icin kullanicinin bu hissi ya$amasi sadece bi kereye mahsustur.Istekler priority Queue'sunda tutuldugu icin, kullanicinin yaptigi istekler herzaman icin read-ahead isteklerinden once yapilacaktir. Ancak istekler asenkron yapildigi icin, kullanici isteginin onceden yapilan read-ahead isteklerden once cevap doneceginin garantisi yok, sadece kullanici istegi yapildigi anda, o istegin cevabi gelene kadar daha fazla read-ahead isteginin yapilmayacaginin garantisi var. Bu $ekilde kullaniciya gayet ba$arili bir ajax hissi veriliyor. Ancak read-ahead isteklerinin server tarafinda gereginden fazla yuk olu$turudugu unutulmamalidir. O yuzden bu yontemi en verimli olarak kullanmanin yolu, veriler JSON ile istemektir. Boylece istenen verinin miktari buyuk olcude azalacak, server ise derin bir "oh" cekecektir.

Hiç yorum yok: