Doğru Cevap
-
10 yıl önce yazılmış84 cevap - 1 soruComet'i AJAX'ın bir uygulama türü olarak düşünebiliriz. Nerede kullanılır dersek en bariz örnek chat uygulaması olabilir.
Bir chat uygulaması yazdığını düşün, bir kişi diğerine mesaj yazınca mesajı diğer kişinin alması için sonuçta bir http request yapılması gerekecek. Bunun için ilk akla gelen çözüm atıyorum 2 saniyede bir ajax sorgusu göndermek. Şimdi bunda iki sorun var: Birincisi mesajlar yine anlık gitmeyecek. Karşılıklı hararetli bir konuşma yaptığını düşünürsek A kişisi mesaj yazdığında B'nin yazdığı cevabı alması 4sn.'ye kadar uzayabilir (Hattaki yavaşlığı hesaba katmadım bile).
İkinci sorun da her gönderilen request'in bir maliyeti var. Hem her seferinde tonla HTTP Header göndermek gerekiyor (cookie'ler, referer tanımları, karakter seti vs. bir sürü data) hem de TCP başlantısı açıp kapatmanın server üzerinde bir maliyeti var.
Comet'te ise temel mantık açık bir connection bırakmak üzerine kurulu. Böylece client data'yı çekmiyor da (pull), server client'a datayı gönderiyor (push). Yöntemlernden biri şöyle; bir Ajax çağrısı yapıyorsun ama herhangi bir data gelip gitmiyor henüz, server data göndermiyor beklemede kalıyor. Data gönderildiği anda da server açık olan connection'dan datayı gönderiyor.
Tabii burada bazı trickler var: Birincisi bir connection açtığın zaman onu sonsuza kadar açık tutmaya çalışmak yanlış olur zira client kopsa server'ın haberi olmayacağı için bir timeout olması lazım. Ayrıca client'ın da bir timeout'u olacaktır mutlaka, ki server'daki timeout bizim kontrolümüzde ama client'ın timeout'una müdahale edemiyoruz. Connection'ı belirli aralıklarla kapatıp açmak lazım. Mesaj gönderen ajax, mesaj bekleyen fonksiyondan da farklı olmalı...
Başka bir kilit nokta da, açık bırakılan connection'ın maliyeti. Eğer bunu apache ile yapmaya kalkarsan açık tuttuğu connection başına apache tüm modüllerini hafızaya alacak: rewrite modülünden tut php'ye kadar. Bu da deli gibi RAM işgal eder.
Php'yi sunan daha hafif bir server kullanılabilir. Hatta belki de bu işi php'siz halletmek gerekebilir. APE (http://www.ape-project.org/) incelenebilir, NginX'in http push module'ü kullanılabilir, stream hub (http://www.stream-hub.com/) incelenebilir...
-
yukonit
Çok güzel bir yazı olmuş.ilginiz için teşekkürler...10 yıl önce yazılmış
- yukonit
Cevaplar
Hiç cevap bulunamadı.