In quali situazioni sarebbe preferibile il polling AJAX long / short rispetto ai WebSocket HTML5?


306

Sto creando una piccola applicazione di chat per gli amici, ma non sono sicuro di come ottenere informazioni in modo tempestivo che non sia manuale o rudimentale come forzare un aggiornamento della pagina.

Attualmente, lo sto implementando usando AJAX semplice, ma questo ha lo svantaggio di colpire regolarmente il server quando scade un breve timer.

Nella ricerca di polling long / short, mi sono imbattuto in HTML5 WebSocket. Questo sembra facile da implementare, ma non sono sicuro se ci sono alcuni svantaggi nascosti. Ad esempio, penso che WebSocket sia supportato solo da alcuni browser. Ci sono altri svantaggi di WebSocket di cui dovrei essere a conoscenza?

Poiché sembra che entrambe le tecnologie facciano la stessa cosa, in quali tipi di scenari si preferirebbe utilizzare l'uno rispetto all'altro? Più specificamente, i WebSocket HTML5 hanno reso obsoleto il polling AJAX long / short o ci sono validi motivi per preferire AJAX ai WebSocket?

Risposte:


508

WebSocket è sicuramente il futuro.

Il polling lungo è una soluzione sporca per impedire la creazione di connessioni per ogni richiesta come fa AJAX, ma il polling lungo è stato creato quando WebSocket non esisteva. Ora a causa di WebSocket, il polling lungo sta scomparendo.

WebRTC consente la comunicazione peer-to-peer.

Consiglio di imparare WebSocket .

Confronto:

di diverse tecniche di comunicazione sul web

  • AJAX - requestresponse. Crea una connessione al server, invia intestazioni di richiesta con dati opzionali, ottiene una risposta dal server e chiude la connessione. Supportato in tutti i principali browser.

  • Sondaggio lungo - requestwaitresponse. Crea una connessione al server come fa AJAX, ma mantiene aperta una connessione keep-alive per qualche tempo (anche se non molto tempo). Durante la connessione, il client aperto può ricevere dati dal server. Il client deve riconnettersi periodicamente dopo la chiusura della connessione, a causa di timeout o eof dei dati. Sul lato server viene comunque trattato come una richiesta HTTP, come AJAX, tranne per il fatto che la risposta su richiesta avverrà ora o in futuro, definita dalla logica dell'applicazione. grafico di supporto (completo) | wikipedia

  • WebSocket - clientserver. Creare una connessione TCP al server e tenerlo aperto per tutto il tempo necessario. Il server o il client può chiudere facilmente la connessione. Il client passa attraverso un processo di handshake compatibile HTTP. Se riesce, il server e il client possono scambiare dati in entrambe le direzioni in qualsiasi momento. È efficace se l'applicazione richiede uno scambio frequente di dati in entrambi i modi. I WebSocket hanno un frame di dati che include il mascheramento per ogni messaggio inviato dal client al server, quindi i dati vengono semplicemente crittografati. grafico di supporto (molto buono) | wikipedia

  • WebRTC - peerpeer. Il trasporto per stabilire la comunicazione tra i client ed è indipendente dal trasporto, quindi può usare UDP, TCP o anche livelli più astratti. Questo è generalmente utilizzato per il trasferimento di dati ad alto volume, come lo streaming video / audio, in cui l'affidabilità è secondaria e alcuni frame o la riduzione della progressione della qualità possono essere sacrificati a favore dei tempi di risposta e, almeno, del trasferimento dei dati. Entrambe le parti (peer) possono trasferire i dati tra loro in modo indipendente. Sebbene possa essere utilizzato in modo totalmente indipendente da qualsiasi server centralizzato, richiede comunque un modo per scambiare dati endPoints, dove nella maggior parte dei casi gli sviluppatori utilizzano ancora server centralizzati per "collegare" i peer. Ciò è necessario solo per scambiare dati essenziali per stabilire una connessione, dopo di che non è richiesto un server centralizzato. grafico di supporto (medio) | wikipedia

  • Eventi inviati dal server - clientserver. Il client stabilisce una connessione persistente ea lungo termine al server. Solo il server può inviare dati a un client. Se il client desidera inviare dati al server, richiederebbe l'uso di un'altra tecnologia / protocollo per farlo. Questo protocollo è compatibile HTTP e semplice da implementare nella maggior parte delle piattaforme lato server. Questo è un protocollo preferibile da utilizzare al posto di Long Polling. grafico di supporto (buono, tranne IE) | wikipedia

vantaggi:

Il vantaggio principale di WebSocket sul lato server è che non è una richiesta HTTP (dopo l'handshake), ma un protocollo di comunicazione basato su messaggi adeguato. Ciò consente di ottenere enormi vantaggi in termini di prestazioni e architettura . Ad esempio, in node.js, è possibile condividere la stessa memoria per connessioni socket diverse, in modo che ciascuna possa accedere alle variabili condivise. Pertanto, non è necessario utilizzare un database come punto di scambio nel mezzo (come con AJAX o Long Polling con un linguaggio come PHP). È possibile archiviare i dati nella RAM o persino ripubblicare immediatamente tra i socket.

Considerazioni sulla sicurezza

Le persone sono spesso preoccupate per la sicurezza di WebSocket. La realtà è che fa poca differenza o addirittura mette WebSocket come opzione migliore. Innanzitutto, con AJAX, vi è una maggiore possibilità di MITM , poiché ogni richiesta è una nuova connessione TCP che attraversa l'infrastruttura Internet. Con WebSocket, una volta connesso, è molto più difficile intercettare nel mezzo, con il mascheramento del frame ulteriormente applicato quando i dati vengono trasmessi da client a server e una compressione aggiuntiva, il che richiede uno sforzo maggiore per sondare i dati. Tutti i protocolli moderni supportano entrambi: HTTP e HTTPS (crittografati).

PS

Ricorda che i WebSocket hanno generalmente un approccio logico molto diverso per la rete , più come i giochi in tempo reale avevano tutto questo tempo e non come gli http.


15
Non si tratta di compatibilità da soli. La cosa più importante è che sta per ripensare completamente il modo in cui sta avvenendo la comunicazione. Poiché le API RESTful funzionano con il modello Richiesta> Risposta, la comunicazione bidirezionale qui sarebbe inutile. Quindi, provare a utilizzare WebSocket per eseguire una query sull'API RESTful è un tentativo un po 'strano e non ne vede alcun beneficio. Se hai bisogno di dati dall'API RESTful ma in modo in tempo reale, crei l'API WebSocket per inviare i dati che funzioneranno con la comunicazione bidirezionale come WebSocket. Stai cercando di confrontare le cose in un angolo che non sono comparabili :)
moka,

2
Ciao @pithhelmet tutto dipende dal software lato server (lingua / tecnologia) da solo. WebSocket è layer su TCP e ci sono molti modi per eseguire implementazioni di stream TCP. I moderni server Web utilizzano l'architettura basata su eventi e sono molto efficienti con i pool di thread. Quale tecnologia stai usando? Node.js utilizza eventi dietro le quinte per IO ed eventi con thread singolo nel contesto di esecuzione, quindi è incredibilmente efficiente. Usare il thread per ogni connessione - è molto inefficiente in termini di RAM (1 MB + per thread) e CPU, poiché quei thread saranno semplicemente inattivi o peggio - ciclo infinito di controllo dei dati.
moka,

4
Il polling lungo non è una soluzione sporca ed è diverso da webSocket. Questi due sono pensati per essere utilizzati in scenari diversi.
bagz_man,

5
@bagz_man Il polling lungo è un uso "bizzarro" della tecnologia per ottenere risultati che la tecnologia non ha consentito per definizione e non era disponibile un'alternativa standard. Il motivo per cui esiste Long Polling è esattamente il fatto che WS non lo ha fatto, Period.
moka,

4
@moka: il livello libero di Cloudflare assorbirà un attacco prolungato di 400 + Gbps. Il tuo portafoglio può assorbire il conto AWS? Anche AWS e Cloudflare hanno opinioni opposte quando si tratta di trattare reclami contro la tua origine. È solo qualcosa da tenere a mente finché discutiamo dei compromessi. :)
danneu

11

Una tecnologia contendente che hai omesso è Server-Sent Events / Event Source. Cosa sono i polling lunghi, i websocket, gli eventi inviati dal server (SSE) e le comete? ha una buona discussione di tutti questi. Tieni presente che alcuni di questi sono più facili da integrare rispetto ad altri sul lato server.


Tra tutti questi, che consiglio suggeriresti di esaminare?
Somdow

Ho avuto successo con il polling lungo, l'unico trucco (per esso e altre tecnologie) non è legare un thread del server. Se non si utilizza un codice server asincrono, questo non verrà ridimensionato.
bmm6o

1
@somdow Maksims-Mihejevs ha risposto bene alla tua domanda nei primi due paragrafi della sua risposta. Usa i websocket.
Jeff Sheffield,

7

Per le applicazioni di chat o qualsiasi altra applicazione in costante conversazione con il server, WebSocketssono l'opzione migliore. Tuttavia, è possibile utilizzare solo WebSocketscon un server che li supporta, quindi ciò potrebbe limitare la possibilità di utilizzarli se non è possibile installare le librerie richieste. In tal caso, è necessario utilizzare Long Pollingper ottenere funzionalità simili.


5
I WebSocket sono supportati da ogni server ... Devi solo installare node.js o qualcosa di simile.
noob,

9
Modificato un po 'per spiegare che sì, qualsiasi server supporterà WebSocket. Tuttavia, se si utilizza il servizio di hosting, potrebbe non essere possibile utilizzarli.
Brant Olsen,

Mi rendo conto che questo thread è un po 'vecchio ma ... WebSocket potrebbe non essere la risposta migliore per tutte le comunicazioni bidirezionali. Di recente ho notato che la documentazione per il supporto dei socket Web di Spring 4 suggerisce che i WebSocket sono più adatti per lo spostamento di grandi quantità di dati o bassa latenza. Se quelli non sono applicabili o non sono una priorità, credo che suggeriscano di utilizzare il polling lungo. Non conosco la piena giustificazione di questo punto di vista, ho appena immaginato che la gente di Spring sappia di cosa stanno parlando in generale.
Stoney,

1
@Stoney a parte il fatto che avresti bisogno di configurare websocket sul server (gestori, ecc.) Non c'è semplicemente alcun motivo per usare il polling lungo su websocket. Websocket è molto più veloce (bassa latenza) e consente al server di "parlare" con il client senza che il client lo chieda. Oggi uso signalr (una delle migliori implementazioni di websocket mai fatte a mio avviso - funziona sul client e sul server e consente al client di chiamare metodi sul server e sul server sul client come se non ci fosse differenza) su ogni sito web che realizzo - caricamento dinamico di contenuti, pagine senza fondo, ecc.
realizzo DividedByZero

0

Polling XHR vs SSE vs WebSocket

  • Polling XHR Una richiesta riceve una risposta quando si verifica l'evento (potrebbe essere immediatamente o dopo un ritardo). Le richieste successive dovranno essere fatte per ricevere ulteriori eventi.

    Il browser effettua una richiesta asincrona del server, che potrebbe attendere la disponibilità dei dati prima di rispondere. La risposta può contenere dati codificati (in genere XML o JSON) o Javascript che devono essere eseguiti dal client. Al termine dell'elaborazione della risposta, il browser crea e invia un altro XHR, in attesa del prossimo evento. Pertanto, il browser mantiene sempre una richiesta in sospeso con il server, per rispondere a ogni evento. Wikipedia

  • Eventi inviati dal server Il client invia la richiesta al server. Il server invia nuovi dati alla pagina Web in qualsiasi momento.

    Tradizionalmente, una pagina Web deve inviare una richiesta al server per ricevere nuovi dati; cioè, la pagina richiede i dati dal server. Con gli eventi inviati dal server, è possibile che un server invii nuovi dati a una pagina Web in qualsiasi momento, inviando messaggi alla pagina Web. Questi messaggi in arrivo possono essere trattati come dati Eventi + all'interno della pagina Web. Mozilla

  • WebSocket Dopo l'handshake iniziale (tramite protocollo HTTP). La comunicazione viene effettuata in modo bidirezionale utilizzando il protocollo WebSocket.

    L'handshake inizia con una richiesta / risposta HTTP, che consente ai server di gestire le connessioni HTTP e le connessioni WebSocket sulla stessa porta. Una volta stabilita la connessione, la comunicazione passa a un protocollo binario bidirezionale che non è conforme al protocollo HTTP. Wikipedia

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.