WebSockets kullanılabilir olduğunda neden AJAX kullanılır?


203

WebSockets'i bir süredir kullanıyorum, Node sunucusu ve WebSockets kullanarak üniversitedeki son yıl projem için Agile proje yönetimi aracı oluşturmayı seçtim. WebSockets kullanarak uygulamamın işleyebileceği saniye başına istek sayısında% 624 artış sağladığını buldum.

Ancak projeye başladığımdan beri güvenlik boşluklarını okudum ve bazı tarayıcılar varsayılan olarak WebSockets'i devre dışı bırakmayı seçti.

Bu beni şu soruya götürüyor:

Neden WebSockets gecikme ve kaynak yükünü azaltmak için harika bir iş yapıyorsa AJAX kullanıyorsunuz, AJAX'ın WebSockets'ten daha iyi yaptığı bir şey var mı?


2
İşte web soketlerini destekleyen motorların bir listesi. en.wikipedia.org/wiki/…
Dante

Yanıtlar:


210

WebSockets AJAX'ın yerini almaz ve Comet / uzun anketin yerini bile almaz (bunun mantıklı olduğu birçok durum olsa da).

WebSockets'in amacı, bir tarayıcı ile sunucu arasında düşük gecikmeli, çift yönlü, tam çift yönlü ve uzun süreli bağlantı sağlamaktır. WebSockets, HTTP ve AJAX (interaktif oyunlar, dinamik medya akışları, mevcut ağ protokollerine köprü oluşturma vb.) Kullanarak gerçekten mümkün olmayan tarayıcı uygulamalarına yeni uygulama alanları açar.

Ancak, WebSockets ve AJAX / Comet arasında kesinlikle bir çakışma vardır. Örneğin, tarayıcı sunucu olaylarından (yani push) haberdar olmak istediğinde, Comet teknikleri ve WebSockets kesinlikle uygun seçeneklerdir. Uygulamanızın düşük gecikmeli push olaylarına ihtiyacı varsa, bu WebSockets lehine bir faktör olacaktır. Öte yandan, mevcut çerçevelerle ve konuşlandırılmış teknolojilerle (OAuth, RESTful API'ler, proxy'ler, yük dengeleyiciler) birlikte var olmanız gerekiyorsa, bu Comet teknikleri lehine bir faktör olacaktır (şimdilik).

WebSockets'in sağladığı özel avantajlara ihtiyacınız yoksa, AJAX ve Comet gibi mevcut tekniklere bağlı kalmak muhtemelen daha iyi bir fikirdir, çünkü bu, mevcut büyük bir araç, teknoloji, güvenlik mekanizması ekosistemini yeniden kullanmanıza ve entegre etmenize izin verir. , bilgi tabanları (ör. stackoverflow üzerinde çok daha fazla kişi HTTP / Ajax / Comet'i WebSockets'ten daha fazla biliyor) vb.

Öte yandan, HTTP / Ajax / Comet'in gecikme ve bağlantı kısıtlamaları içinde iyi çalışmayan yeni bir uygulama oluşturuyorsanız, WebSockets'i kullanmayı düşünün.

Ayrıca, bazı yanıtlar WebSockets'in olumsuz yanlarından birinin sınırlı / karışık sunucu ve tarayıcı desteği olduğunu göstermektedir. Biraz dağıtmama izin ver. İOS (iPhone, iPad) hala eski protokolü (Hixie) desteklerken, çoğu WebSockets sunucusu hem Hixie'yi hem de HyBi / IETF 6455 sürümünü destekler. Diğer birçok platform (zaten yerleşik desteği yoksa) webSockets desteğini web-socket-js (Flash tabanlı çoklu dolgu) aracılığıyla alabilir. Bu, web kullanıcılarının büyük çoğunluğunu kapsar. Ayrıca, sunucu arka ucu için Düğüm kullanıyorsanız , web-socket- js'yi yedek olarak içeren Socket.IO'yu kullanmayı düşünün ve bu bile mevcut değilse (veya devre dışı bırakılmışsa), Comet tekniği ne olursa olsun geri dönecektir. verilen tarayıcı için kullanılabilir.

Güncelleme : iOS 6 artık mevcut HyBi / IETF 6455 standardını destekliyor.


37
Ve şimdi 2014'ün şafağında, WebSockets pratik olarak standart (RFC 6455) ve sadece Opera mini bunu desteklemiyor.
Dirk Bester

4
Doğru, Opera Mini bunu desteklemiyor, ancak daha utanç verici olan Android tarayıcısının desteklenmemesi, webview tabanlı uygulamalarla (Cordova PhoneGap) kullanımı biraz daha karmaşık hale getiriyor
Miles M.

2
@kanaka, Her ikisi de büyük dosyaları eşit derecede iyi yapıyorsa, neden her şeyi websockets üzerinden göndermiyorsunuz? WebSockets üzerinden her şey gönderilebildiğinde sayfaları / verileri neden rahatsız edesiniz? (Diyelim ki zaten 2020 ve tüm tarayıcılarda WebSockets desteği var)
Pacerier

3
@Pacerier tam bir cevap uzun olurdu, ancak temelde tarayıcının zaten iyi yaptığı şeyleri (önbellekleme, güvenlik, paralellik, hata işleme, vb.) Yeniden uygulamaya çalıştığınız gerçeğine dayanır. Performansla ilgili olarak, sıfırdan büyük büyük dosya aktarım hızı benzer olsa da, tarayıcıların web içeriğinin önbelleğe alınmasını (çoğu AJAX istekleri için geçerli olan) ince bir şekilde ayarlamak için yıllar geçmiştir, bu nedenle uygulamada, AJAX'tan WebSockets'e geçmenin çok fazla bir şey sağlaması pek olası değildir. mevcut işlevsellik için avantaj. Ancak düşük gecikmeli iki yönlü iletişim için büyük bir kazanç.
kanaka

5
Üzgünüm ama benim için soruyu cevaplamıyor. Temel olarak, birbirlerinin yerini almayı amaçlamadıklarını ve WS'nin tam olarak desteklenmediğini söylüyor (şimdi). AJAX'ı neden websocket üzerinden tercih edeceğinizi yanıtlamıyor? Örneğin Discord'u ele alalım. Discord, iletileri sunucudan istemcilere iletmek için WS'yi kullanır, bu arada istemciden sunucuya HTTP istekleri kullanır (ileti gönder, istek verileri vb.). Bunu neden yapacağınızı gerçekten yanıtlamak için bu soruya geldim. AJAX'ı açık WS bağlantısının üstüne koymanızın bir tür teknik nedeni var mı?
Charlotte Dunois

63

Aralık 2017'ye kadar, Websockets her tarayıcı tarafından (neredeyse) desteklenmektedir ve kullanımları çok yaygındır.

Ancak bu, Websockets'in, özellikle HTTP / 2 uyarlaması arttıkça, AJAX'ın yerini almayı başardığı anlamına gelmez.

Kısa cevap, AJAX'ın Websockets kullanırken bile çoğu REST uygulaması için hala harika olmasıdır. Ama tanrı ayrıntılarda, bu yüzden ...:

Yoklama için AJAX?

Yoklama (veya uzun yoklama) için AJAX kullanımı ölüyor (ve olması gerekiyor), ancak yine de iki iyi nedenden dolayı (özellikle daha küçük web uygulamaları için) kullanımda kalıyor:

  1. Birçok geliştirici için, özellikle arka ucun kodlanması ve tasarlanması söz konusu olduğunda, AJAX'ın kodlanması daha kolaydır.

  2. HTTP / 2 ile AJAX ile ilgili en yüksek maliyet (yeni bir bağlantının kurulması) ortadan kaldırılarak AJAX çağrıları, özellikle veri gönderme ve yükleme için oldukça yüksek performans gösterir.

Bununla birlikte, Websocket push , AJAX'tan çok daha üstündür (başlıkların yeniden doğrulanmasına veya yeniden gönderilmesine gerek yoktur, "veri yok" gidiş dönüşlerine gerek yoktur). Bu birkaç kez tartışıldı .

REST için AJAX?

AJAX için daha iyi bir kullanım REST API çağrılarıdır. Bu kullanım, kod tabanını basitleştirir ve Websocket bağlantısının engellenmesini önler (özellikle orta boyutlu veri yüklemelerinde).

REST API çağrıları ve veri yüklemeleri için AJAX'ı tercih etmenin birkaç zorlayıcı nedeni vardır :

  1. AJAX API, REST API çağrıları için pratik olarak tasarlanmıştır ve mükemmel bir seçimdir.

  2. AJAX kullanarak REST çağrılarının ve yüklemelerinin kodlanması, hem istemcide hem de arka uçta önemli ölçüde daha kolaydır.

  3. Veri yükü arttıkça, ileti parçalanması / çoğullama mantığı kodlanmadıkça Websocket bağlantıları engellenebilir.

    Bir yükleme tek bir Websocket sendçağrısında gerçekleştirilirse , yükleme bitene kadar bir Websocket akışını engelleyebilir. Bu, özellikle yavaş istemcilerde performansı azaltacaktır.

Yaygın bir tasarım, REST ve veri yüklemeleri (istemciden sunucuya) Websocket'in engellenmesini önlemek için AJAX'ın kullanım kolaylığından yararlanırken Websockets üzerinden aktarılan küçük bidi iletileri kullanır.

Ancak, daha büyük projelerde Websockets tarafından sunulan esneklik ve kod karmaşıklığı ile kaynak yönetimi arasındaki denge Websockets lehine dengeyi değiştirecektir.

Örneğin, Websocket tabanlı yüklemeler, bir bağlantı kesilip yeniden kurulduktan sonra büyük yüklemelere devam etme olanağı sunabilir (yüklemek istediğiniz 5GB filmi hatırlıyor musunuz?).

Yükleme parçalama mantığını kodlayarak, kesintili bir yüklemeye devam etmek kolaydır (zor kısım şeyi kodlardı).

HTTP / 2 push'a ne olacak?

Muhtemelen HTTP / 2 push özelliğinin Websockets yerine geçmediğini (ve muhtemelen yapamayacağını) eklemeliyim.

Bu daha önce burada tartışılmıştı , ancak tek bir HTTP / 2 bağlantısının tüm tarayıcıya (tüm sekmeler / pencereler) hizmet ettiğinden bahsetmek yeterlidir, bu nedenle HTTP / 2 tarafından itilen veriler hangi sekmeye / pencereye ait olduğunu bilmez, Websocket'in verileri doğrudan belirli bir tarayıcı sekmesine / penceresine aktarma yeteneğini değiştirme kapasitesini ortadan kaldırır.

Websockets küçük çift yönlü veri iletişimi için mükemmel olsa da, AJAX hala özellikle daha büyük yükler (yüklemeler vb.) Göz önüne alındığında birçok avantaj taşıyordu.

Peki ya Güvenlik?

Genel olarak, bir programcıya ne kadar çok güven ve denetim sunulursa, araç o kadar güçlü olur ... ve sürünen güvenlik endişeleri artar.

AJAX'ın doğası gereği üstünlüğü vardır, çünkü güvenliği tarayıcının kodunda yerleşiktir (bu bazen tartışmalıdır, ancak hala oradadır).

Öte yandan, AJAX çağrıları "ortadaki adam" saldırılarına karşı daha hassastır, Websockets güvenlik sorunları genellikle bir güvenlik açığı getiren uygulama kodundaki hatalardır (genellikle arka uç kimlik doğrulama mantığı bunları bulacağınız yerdir).

Kişisel olarak, Websockets'in biraz daha iyi olduğunu düşünüyorsanız, özellikle ne yaptığınızı bildiğinizde, bu kadar büyük bir fark bulamıyorum.

Benim Mütevazi Görüşüm

IMHO, REST API çağrıları dışında her şey için Websockets kullanırdım. Büyük veri yüklemeleri Mümkünse Web Soketleri üzerinden parçalayıp gönderirim.

Yoklama, IMHO, yasadışı ilan edilmelidir, ağ trafiğinde maliyet korkunç ve Websocket push yeni geliştiriciler için bile yönetmek için yeterince kolaydır.


2
Küçük dilbilgisi hatası 'Ben bir şey varsa ...' düşünüyorum 😀
spottedmahn

2
@spottedmahn - Teşekkürler! Metin taslağı için kod düzenleyicimi kullandığımı tahmin ediyorum 🙃
Myst

1
Özür dilerim, ödülün süresi dolduğunda yoktu. Benim açımdan kötü planlama. 23 saatlik sürenin sonunda size vereceğim başka bir ödül daha ayarladım.
Duncan Jones

@Bu harika açıklama için teşekkürler. Fb / stackoverflow gibi canlı bildirimler için neyi tercih edersiniz? Web uygulamam için bir RestFull web hizmeti tasarlıyorum, ancak bildirim özelliği için ne kullanmalıyım? AJAX veya WebSockets?
TheCoder

@puspen bildirimleri (IMHO) Websockets için mükemmel bir seçimdir. Yeniden bağlanma mantığı ve çevrimdışı bildirim kuyrukları tasarlarken verilecek çok sayıda karar var, ancak gerçek bildirimin kodlanması ve websockets ile gerçekleştirilmesi kolaydır.
Myst

18

Eski tarayıcılarla ilgili sorunlara ek olarak (IE10'dan itibaren WebSockets destekleneceği için IE9 dahil), şeffaf proxy'ler, ters proxy'ler ve yük dengeleyiciler de dahil olmak üzere henüz WebSockets'i desteklemeyen ağ aracılarında hala büyük sorunlar var. WebSocket trafiğini tamamen engelleyen bazı mobil operatörler vardır (HTTP YÜKSELTME komutundan sonra).

Yıllar geçtikçe, WebSockets gittikçe daha fazla desteklenecektir, ancak bu arada tarayıcılara veri göndermek için her zaman HTTP tabanlı bir geri dönüş yöntemine sahip olmalısınız.


Neyse ki, çoğu WebSocket çerçevesi, yuvalar için Flash kullanımı da dahil olmak üzere, söz konusu yedekleri destekler. Socketn.IO ve SignalR hem iyi çerçevelerdir ... hem de proxy'ler ve yük dengeleyiciler nedeniyle bahsettiğiniz gibi gerçekten sınırlısınız. Neyse ki, hem Node.JS hem de sonraki IIS, bu rolle de iyi bir iş çıkarıyor.
Tracker1

Meraklı: Hangi taşıyıcılar 80 numaralı bağlantı noktasındaki WebSocket'i engelliyor? 443 numaralı bağlantı noktasında hangi WebSocket (WSS) güvenliğini engeller? İkincisi, zorlanmış, şeffaf MITM web proxy'lerini ima eder. Bunu, herkese açık ağlarda (sadece kurumsal olanlar) görmedim, çünkü tarayıcılara yeni CA sertifikaları yüklemeyi gerektirir.
oberstet

Düşman örneği, şu anda Vodafone İtalya, 80 numaralı bağlantı noktasında WS'yi engelliyor, ancak 443 numaralı bağlantı noktasında WSS'ye izin veriyor. Hem HTTP hem de HTTPS'den erişebileceğiniz ana sayfamız aracılığıyla herhangi bir taşıyıcıyı kolayca test edebilirsiniz. WebSockets'i dener ve engellenirse HTTP'ye geri döner. Geçerli aktarımı bildiren ortada bir widget görüntülemek için bu URL'yi kullanın: lightstreamer.com/?s
Alessandro Alinone

17

Web soketleri ve güvenlik hakkında okuduğum şikayetlerin çoğu, web tarayıcı güvenliği ve güvenlik duvarı güvenlik araçlarının güvenlik satıcılarından geliyor. Sorun, websockets trafiğinin güvenlik analizini nasıl yapacağını bilmiyor olmalarıdır, çünkü HTTP'den websocket ikili protokolüne yükseltme yaptıktan sonra, paket içeriği ve anlamı uygulamaya özeldir (ne programladığınıza bağlı olarak). Bu, geçim kaynağı tüm internet trafiğinizi analiz etmeye ve sınıflandırmaya dayanan bu şirketler için açıkçası lojistik bir kabus. :)


11

WebSockets eski web tarayıcılarında çalışmaz ve bunu destekleyen tarayıcılar genellikle farklı uygulamalara sahiptir. AJAX yerine sürekli kullanılmamasının tek iyi nedeni budur.


8
Bunun daha iyi bir nedeni, AJAX isteğinin, HTTP kaynaklarını alabileceği anlamına gelen normal bir HTTP isteğidir; WebSockets bunu yapamaz.
Dan

@Dan Örneğin görüntü dosyaları base64, CSS olarak metin, JavaScript olarak da metin olarak gönderilir ve sonra belgeye eklenirse ne olur? Bu makul olur mu?
Jack

@DanD. +1, katılıyorum, sanırım soruya, örneğin örneğindeki gibi hızlı akış verileri bağlamından yaklaşıyordum, ama bu kesinlikle doğru.
jli

@Dan D - bazen çerezler ve başlıklar gibi tüm bu saçmalıkların üzerinden geçmesini istemezsiniz ...
vsync

8
@DanD., HTTP ve WebSocket iki ayrı protokoldür, Tabii ki WebSocket protokolünü kullanarak HTTP kaynaklarını talep edemeyiz, aynı nedenle HTTP protokolünü kullanarak WebSocket kaynaklarını talep edemeyiz! Bu, istemcinin Websocket protokolü aracılığıyla gönderilen html ve / veya görüntü dosyalarını isteyemeyeceği anlamına gelmez.
Pacerier

2

Websockets ve HTTP'yi rakipsiz olmadığı veya aynı sorunları çözdüğü için net bir karşılaştırma yapabileceğimizi sanmıyorum.

Websockets, uzun ömürlü çift yönlü veri akışını neredeyse gerçek zamanlı olarak işlemek için mükemmel bir seçimdir, REST ise ara sıra iletişim için mükemmeldir. Websockets kullanmak hatırı sayılır bir yatırımdır, dolayısıyla ara sıra yapılan bağlantılar için aşırıya kaçar.

Websockets'in yüksek yükler olduğunda daha iyi performans gösterdiğini görebilirsiniz, HTTP bazı durumlarda önbellekleme kullanabileceğinden biraz daha hızlıdır. REST'i Websockets ile karşılaştırmak, elmaları portakallarla karşılaştırmak gibidir.

Hangisinin uygulamamız için daha iyi bir çözüm sağladığını kontrol etmeliyiz, hangisi kullanım durumumuzda en uygun olanı kazanır.


1
soru genel olarak AJAX ile ilgiliydi, özellikle REST ile değil. AJAX'ın REST için kullanılabileceği doğrudur, ancak aynı zamanda yoklama ve uzun yoklama için de kullanılır. Sonucunuza katılıyorum (cevabımdan da anlayabileceğiniz gibi), cevabınızın ayrımı yansıtabileceğini düşünüyorum (HTTP yöntemlerini kullanmasa da Websockets'in REST için de kullanılabileceğini unutmayın).
Myst

@ Sana katılıyorum.
Gaurav Gandhi

1

HTTP ve Websockets arasındaki, REST API'leri gibi Websocket uç noktasını ve istemcideki Websockets gibi RESTful uç noktalarını işleyebilen istemci boyutlu bir lib biçimindeki farklılıklara bir örnek. https://github.com/mikedeshazer/sockrest Ayrıca, istemcide bir websocket API'sini kullanmaya çalışanlar için veya tam tersi alışıldıkları şekilde. Libs / sockrest.js, farkları açıkça ortaya koymaktadır (ya da daha doğrusu).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.