Asenkron ve Senkron Meselesi

AJAX eburhan

AJAX’i Anlamak yazısında AJAX’i tarif ederken açılımının Asenkron Javascript ve XML olduğunu söylemiştik. Buradaki Javascript’i ve XML’i mutlaka bir yerlerden duymuşsunuzdur fakat Asenkron neyin nesi hiç merak ettiniz mi? Neden senkron değil de asenkron? Asenkron ve senkron arasındaki fark nedir? Birbirlerine karşı avantajları ve dezavantajları var mıdır? Yazımızda bu sorulara cevap arayacak, AJAX tanımı içerisinde neden Asenkron kullandığını belirlemeye çalışacağız.

30 saniyede AJAX yazısında da belirtildiği gibi AJAX tekniğinin çekirdeğini XMLHttpRequest adı verilen nesne oluşturmaktadır. Bu nesne sayesinde sayfalar arası etkileşim kurabiliyoruz. XMLHttpRequest nesnesi hem asenkron (eş zamanlı) hem de senkron (eş zamansız) olarak çalışabilen bir yapı üzerine kurulmuştur. Şimdi bu yapının hangi durumlarda nasıl kullanılması gerektiğine bakalım.

1. Senkron Çalışma

Senkron çalışırken aynı zaman diliminde yalnızca 1 işlem yapabiliyoruz. Web tarayıcımızdan uzaktaki web sunucusuna gönderilen istek, web sunucusunda işlenir ve tekrar geldiği yoldan web tarayıcımıza geri döner. Elbette bu işlem belli bir zaman alır. Senkron çalışıyorken bu zaman diliminde başka bir istek gönderemiyoruz.

Senkron çalışma, özellikle web sunucusu aynı bilgisayarda ise veya yakın olan bir LAN üzerindeyse sağlıklı çalışabilir. Fakat web sunucusu ağır bir yük altındaysa veya web tarayıcısı web sunucusuyla yavaş bir bağlantı üzerinden etkileşime geçtiyse kötü bir performans verecektir. Çünkü web tarayıcımız içerisindeki JavaScript motoru, gönderdiği istek tamamlanıncaya kadar bloke edilir ve web tarayıcısı donmuş bir şekilde isteğin tamamlanmasını bekler. Bu zaman diliminde kullanıcı, gönderilen isteği iptal de edemez. Bu yüzden web sayfasındaki başka bir noktaya tıklayamaz veya başka bir sekmeye geçiş yapamaz.

Senkron çalışma
Resimde de görüldüğü gibi web tarayıcısından çıkan 1 nolu istek, web sunucusuna iletiliyor. Alınan istek işlendikten sonra web tarayıcısına geri gönderiliyor. Ve bu zaman diliminde başka bir isteğe yer verilmiyor.

2. Asenkron Çalışma

Asenkron çalışırken ise aynı zaman diliminde birden fazla işlem yapılabiliyor. Örneğin web sayfasında bir form doldurdunuz. Formdaki bilgiler AJAX ile gönderiliyorken işlemin bitmesini beklemek zorunda değilsiniz. O zaman diliminde web sayfasının başka bir yerinde bulunan anket’i cevaplayabilirsiniz. Çünkü senkron çalışıyorken bloke edilen JavaScript motoru, asenkron çalışıyorken serbesttir ve başka isteklerin gönderilmesine müsaade eder. Yani aynı zaman dilimi içerisinde birden fazla isteği kabul edebilir.

Asenkron çalışma
Resimde de görüldüğü gibi aynı zaman dilimi içerisinde 4 adet istek yapılmış. Kullanıcı bu isteklerin tamamlanmasını beklemek zorunda değil. İstekler tamamlana dursun, siz web sayfasında özgürce dolaşmaya devam edebilirsiniz.

Hangi yöntem kullanılmalı?

Eğer uygulamanızda bir işlem önceliği mecbur tutuluyorsa senkron çalışmalısınız. Eğer 1 nolu istek tamamlanmadan 2 nolu isteğe kesinlikle geçilmemesini istiyorsanız asenkron çalışma size ters düşecektir.

Ayrıca web tarayıcısı ile web sunucusu arasındaki bağlantı yavaşsa kesinlikle senkron çalışmaktan uzak durun. Örneğin buradaki videoda yavaş bir bağlantıyla beraber senkron çalışmanın verdiği olumsuz durum gösterilmiştir.

Fakat bir işlem önceliğinin mecbur tutulmadığı web uygulamalarında senkron çalışma önerilmez. Örneğin form ve anket birbiriyle ilişkili olmadığı sürece ziyaretçiye "ilk önce formu doldurun daha sonra anketi cevaplayın" şeklinde mecburi bir işlem yaptıramazsınız. Kimileri ilk önce formu doldurmak isteyecek kimileri de ilk önce anketi cevaplamayı tercih edecektir.

Kısacası internet üzerinde çalışacak bir uygulama hazırlayacaksak asenkron çalışmalıyız. Hem ziyaretçilerin web tarayıcıları donmayacaktır hem de aynı anda birden fazla işlem yapılarak zaman kaybı giderilecektir. İlerleyen günlerde Ajax-Tr sitesinde internet üzerinde çalışan uygulamalar hazırlayacağımız için biz de asenkron çalışmayı tercih edeceğiz.

Yöntemi seçtim ama nasıl kullanacağım?

30 saniyede AJAX yazısında isteklerin AJAX üzerinden nasıl gönderileceği açıklanmıştır. Hatırlamak gerekirse http.open(’get’, ‘kontrol.php’) satırıyla yeni bir istek açıyorduk. İşte bu satırın sonuna eklenen bir bilgi ile uygulamamızın asenkron mu yoksa senkron mu çalışacağını belirtebiliyoruz. Eğer true bilgisini eklersek uygulamamız asenkron, false bilgisini eklersek de senkron olarak çalışacaktır. İlerleyen günlerde yapacak olduğumuz uygulamalarda asenkron çalışmayı tercih edeceğimiz için şu satırı kullanacağız: http.open(’get’, ‘kontrol.php’, true)

Bir sonraki yazıda görüşmek üzere …

Kaynaklar:

Toplamda 5190 kez okunmuş.
Şu an 1 kişi okuyor.
En fazla 7 kişi aynı anda okumuş.
Bugün 3 kez okunmuş.

Etiketler:

1 oy2 oy3 oy4 oy5 oy (20 oy, ortalama 4.45) Oylanıyor ... Oylanıyor ...

  1. PHP ve Yerleşik DOM Sınıfları
  2. Sağlamlığı Kanıtlanmış Tekniklerle Web 2.0 AJAX
  3. Same Origin Policy ( Aynı Kaynak Politikası)

Trackback Yorumları takip et Baskı Önizleme

17 yorum var

  1. # yakuter | 03 Şubat 2007, 18:13 Gravatar

    Erhan, fazla bilinmeyen bu iki terimi çok güzel açıklamışsın. Umarım asenkron çalışma konusunda merakı olanların kafalarındaki soruları bir nebze olsun cevaplamıştır bu yazı.

  2. # eburhan | 03 Şubat 2007, 20:13 Gravatar

    Teşekkürler Erhan :) Biraz araştırma yaptım bu konuda ama gerçekten de bu konuya değinen pek fazla Türkçe kaynak bulamadım. Umarın bu eksikliği bir nebze de olsun gidermişizdir ;)

  3. # Kerim Ayar | 03 Şubat 2007, 23:42 Gravatar

    teşekkürler bu yazı sayesinde ajax ın çalışma prensibini daha iyi anladım,bilgi paylaşımı için Allah razı olsun.

  4. # ibrahim | 06 Şubat 2007, 09:27 Gravatar

    Eburhan ellerine sağlık, yazı gerçekten de güzel. Keyifle okudum.
    Yazıyı okurken aklıma bazı şeyler geldi sizlerle paylaşmayı istedim:

    Buradaki senkron ve asenkron yapısı her türlü iletişimde geçerlidir. Yani siz ister web ister network ister X uygulaması yapın senkron yapıda bir öncekini beklerken, asenkron yapıda bir öncekini beklemezsiniz.

    Şimdi burada aklıma takılan birşey var. Asenkron yapı her ne kadar güllük gülistanlık olsa da başlangıç ve bitişi belirtmek için start-stop biti tarzında yapılar gerektirir. Acaba webde iş nasıl oluyor bilen var mı? Yani sizin formunuz gönderilirken mesela orada ufak bir loading icon çıktı diyelim. O icon’u durduran nedir? Yani bir şekilde işlemin tamamlandığını bildiren yapıyı soruyorum.

    Her ne kadar web uygulamaları asenkron olmalıdır diye düşünmüş olsak da görüyoruzki AJAX daha yeni yeni yaygınlaşıyor. Hala senkron yapı çoğu yerde karşımızda. Acaba bu geçişteki sıkıntı neden olabilir? Kodlamanın zor gelmesi mi, araç yetersizliği mi, yoksa önceki yapıların yeterince modüler olmayışından ötürü sistemi değiştirmeye korkmaları mı?

    Düşüncelerinizi merak ediyorum…

  5. # eburhan | 06 Şubat 2007, 10:05 Gravatar

    @ibrahim
    Öncelikle ben bu konuyu “web tabanlı” uygulamaları göz önünde bulundurarak değerlendirdim. Hangi iletişim türünü kullanacağımız, bizim kendi uygulamamızı ne kadar tanıdığıza bağlı. “Hangi yöntem kullanılmalı?” başlığının altında belirttim. Eğer sizin uygulamanızda bir işlem önceliği varsa, yani 1 nolu istek tamamlanmadan 2 nolu isteğin gönderilmemesini istiyorsak Senkron çalışmak gerekiyor. Fakat şu durumda Senkron çalışma daha fazla kontrol gerektiriyor. Çünkü web tabanlı bir uygulamada, karşıdaki sunucunun kontrolü bizde değil. Sunucu ile aramızdaki bağlantı da bizim kontrolümüzde değil. Eğer sunucu ve bağlantıda bir yavaşlık veya daha başka bir problem oluşursa uygulamamız şartlar düzelinceye kadar donacaktır. Ziyaretçi açısından sıkıntılı bir durum :)

    Gönderdiğimiz isteğin tamamlanıp tamamlanmadığını XmlHttpRequest (XHR) nesnesi bize bildirebiliyor. “readyState” özelliği sayesinde o anki işlemin durumunu gözetleyebiliyoruz.
    0 = başlatılamadı
    1 = bağlantı kuruldu
    2 = veri gönderildi
    3 = veri alınıyor
    4 = veri yüklendi (işlem bitti)

  6. # ibrahim | 06 Şubat 2007, 12:14 Gravatar

    @eburhan cevap için teşekkürler

    readyState aradığım cevaptı. Yani burada da bu özelliklik bir çeşit start-stop biti olarak kullanılmış.
    Sanırım readyState’in sürekli sorgulanması veya sıklıkla kontrol edilmesi de ağ üzerinde yine bir overhead oluşmasına neden olacaktır. Bunu da dikkatli kullanmakta fayda var diye düşünüyorum.

  7. # yakuter | 06 Şubat 2007, 12:34 Gravatar

    @ibrahim aslında readystate’i tekrar tekrar kontrol etmeye gerek yok. Bunun sebebi de “onreadystatechange” Aslında isminden de belli sanırım :) Sunucudan bir cevap geldiği zaman bu özellik aktif hale gelir. Bu özellik aktif hale gelince readystate’i kontrol ederiz. Böylelikle sürekli bir kontrol yapma külfetinden ve sistemde oluşacak overhead’lerden bir nebze kurtulmuş oluyoruz.

  8. # ibrahim | 06 Şubat 2007, 13:53 Gravatar

    @yakuter teşekkürler. Güzel bir mekanızma kurmuşlar. Yani işlemcideki interrupt olayı gibi.

    Bu arada bu soruları soruyorum çünkü buradaki cevaplar ile de yeni birşeyler öğrenmek ve açılımda bulunmak mümkün bence.

    Ayrıca ziyaretçi arkaşlara da bu yapılar uygulama geliştirme sırasında yardımcı olabilir. Mesela sizler de bir uygulama geliştirirken sürekli bir işlem gerçekleşmiş mi diye kontorl eden bir mekanizma kurmaktan kaçınmalısınız.
    Bunun yerine işlemin yapıldığı yerden size işlem bitince bir uyarı gelmesini sağlamalısınız.

    Bunlara dikkat ederek daha performanslı uygulama geliştirmeniz ve fark yaratmanız mümkün.

  9. # yakuter | 06 Şubat 2007, 14:04 Gravatar

    @İbrahim, aynen dediğin gibi yorumlar çok önemli. Burada konuştuklarımız da zaten konuyu pekiştiren şeyler ve mutlaka faydası olacaktır insanlara…

  10. # cemil | 11 Şubat 2007, 15:48 Gravatar

    anlatım yine mükemmel olmuş. yavaş yavaş teknik detaylara girildiğini seziyorum çok garip hâlâ anlıyorum. bu arada video’yu seyredemedim. senkron.swf çalışmadı. nazar boncuğu olarak konulduysa saygı duyarım. nazar değmesin tü tü tü 41 kere manşallah diyelim.

  11. # eburhan | 11 Şubat 2007, 15:55 Gravatar

    Tekrar kontrol ettim video çalışıyor. Sanırım sizin web tarayıcınızda flash player eklentisi olmadığı için görüntüleyemiyorsunuz.

  12. # cemil | 11 Şubat 2007, 16:54 Gravatar

    olabilir. yükleyip tekrar deneyeceğim. link için sağolun.

  13. # enes | 12 Şubat 2007, 18:49 Gravatar

    herşeyi okuyorum ve sizi tebrik ediyorum.. inşallah ben de sizin sayenizde faydalı işler yaparım.

  14. # Genç Haritacı | 21 Şubat 2007, 14:44 Gravatar

    Arkadaşlar uzun zamandır kafamdaki büyük soru işaretlerinden biriydi bu konu. Bu kadar kapsamlı bir cevabı nasıl bulabilirdim başka yerde bilmiyorum. Zaman ayırıp bu makaleyi yazan arkadaşlarımıza çok teşekkürler. bu siteden çok şey öğreniyorum gerçekten.

  15. # selant | 05 Mayıs 2007, 23:32 Gravatar

    Makaleleriniz çok açıklayıcı ve öğretici, çok teşekkürler.. Bu iş gerçekten çok keyifli, puzzle gibi.

  16. # deniz | 08 Temmuz 2007, 01:19 Gravatar

    Değer üstad bu makaleleri anlamaya çalışıyorum fakat benim bilgim sadece asp programlamada asp.net demiyorum asp sadece asp bu uygulamaların asp ile verilecbilecek bir örneği yokmudur? yoksa aspde buraya kadar öğrendiğimiz yeter php yemi geçelim? .net mi öğrenelim? değişken yollamak ve fordan gelen değişkenlerin nasıl cevaba dönüşdüğü gayet açık ama bu uygulamanın asp ile nasıl birleştirileceği konusunda EN UFAK BİR BELGEYE RASTLAYAMADIM şimdiden CEVAP İÇİN TEŞK

  17. # atakan | 21 Eylül 2007, 08:13 Gravatar

    biraz daha açık olabilir di iyi ama daha ufak detaylara inebilirsiniz yinede teşekkürler.

Yorum yazın

sayfa sayacı