46

C'è una grande differenza (in termini di prestazioni, disponibilità dell'implementazione del browser, carico del server, ecc.) Tra HTML5 SSEs e il polling Ajax? Dal lato server, sembra che un EventSource stia colpendo la pagina specificata ogni ~ 3 secondi circa (anche se capisco che i tempi sono flessibili).Eventi inviati dal server vs Polling

Concesso, è più semplice da configurare sul lato client che impostare un timer e averlo $.get ogni tanto, ma c'è qualcos'altro? Invia un numero inferiore di intestazioni o fa qualche altra magia che mi manca?

risposta

67

Il polling Ajax aggiunge un sacco di overhead HTTP poiché stabilisce costantemente e abbatte le connessioni HTTP. Come HTML5 Rocks lo mette "Eventi inviati dal server, d'altro canto, sono stati progettati da zero per essere efficienti."

Gli eventi inviati dal server aprono una singola connessione HTTP di lunga durata. Il server quindi invia unidirezionalmente i dati quando ce l'ha, non è necessario che il client lo richieda o faccia qualsiasi cosa che non aspetti i messaggi.

Uno svantaggio per gli eventi inviati dal server è che poiché creano una connessione permanente al server, è possibile che siano disponibili molte connessioni aperte al server. Alcuni server handle massive numbers of concurrent connections better di altri. Detto questo, avresti problemi simili con il polling più il sovraccarico di ristabilire costantemente tali connessioni.

Gli eventi inviati dal server sono piuttosto buoni supported in most browsers, l'eccezione notevole, naturalmente, è IE. Ma c'è uno couple di polyfills (e uno jQuery plugin) che lo aggiusterà.

Se si sta facendo qualcosa che richiede solo la comunicazione unidirezionale, andrei sicuramente con gli eventi inviati dal server. Come hai detto, gli eventi inviati dal server tendono ad essere più semplici e più puliti da implementare sul lato client. Hai solo bisogno di impostare listener per messaggi ed eventi e il browser si occupa di cose di basso livello come la riconnessione se disconnessi, ecc. Sul lato server è anche abbastanza facile da implementare poiché usa solo un testo semplice. Se si inviano oggetti codificati JSON, è possibile trasformarli facilmente in oggetti JavaScript sul client tramite JSON.parse().

Se si utilizza PHP sul server, è possibile utilizzare json_encode() per trasformare stringhe, numeri, matrici e oggetti in JSON correttamente codificato. Altre lingue di back-end possono anche fornire funzioni simili.

2

Vorrei solo aggiungere una prospettiva più elevata a ciò che è stato detto, e cioè che SSE è modello di sottoscrizione di pubblicazione in contrapposizione a polling costante in caso di AJAX.

In genere, entrambi i modi (polling e publish-subscribe) stanno cercando di risolvere il problema su come mantenere uno stato aggiornato sul client.

1) Polling model

È semplice. Il client (browser) prima ottiene uno stato iniziale (pagina) e per l'aggiornamento, ha bisogno di richiedere periodicamente lo stato (pagina o sua parte) ed elaborare il risultato nello stato corrente (aggiornare l'intera pagina o renderlo in modo inteligente nel suo stato parte nel caso di AJAX).

Naturalmente, uno svantaggio è che se non accade niente con lo stato del server, le risorse (CPU, rete, ...) vengono utilizzate inutilmente. Un altro è che anche se lo stato cambia i client lo ottiene solo al successivo periodo di polling, non al più presto. Spesso è necessario valutare un buon compromesso temporale tra le due cose.

Un altro esempio di polling è uno spinwait nella filettatura.

2) publish-subscribe modello

Funziona come segue:

  • (client prime richieste e mostra un certo stato iniziale)
  • cliente sottoscrive il server (invia una richiesta, possibilmente con un certo contesto come sorgente di eventi)
  • server contrassegna il riferimento al client ad alcuni dei suoi repository di riferimento client
  • in caso di un aggiornamento dello stato, se rver invia una notifica al client in base al riferimento al client che detiene; vale a dire che non è una risposta a una richiesta, ma un messaggio avviata dal server
  • buoni clienti annullare l'iscrizione quando non sono più interessati alle notifiche

Questo è SSE, o all'interno di infilare un evento waitable, come un altro esempio. Un inconveniente naturale, come affermato, è che il server deve conoscere tutti i suoi client sottoscritti che, a seconda dell'implementazione, possono essere un problema.

Problemi correlati