2012-01-28 9 views
6

Beh, non so quale sia il modo più efficiente di fare. Qualcuno potrebbe aiutarmi a trovare un algoritmo migliore.I polling frequenti sovraccaricano il server? In tal caso, qual è il modo migliore per implementare gli aggiornamenti live?

ok prendiamo qualche esempio come Facebook quando l'utente pubblica un post, sarà aggiornato al suo amico senza alcun aggiornamento della pagina e lo sappiamo da una richiesta Ajax. Ma come possiamo sapere che qualcuno ha pubblicato una nuova cosa? potrebbe essere come mettere un timer per ogni 2 secondi e inviare una richiesta di ajax per alcuni tavoli e controllare se qualche utente ha postato qualcosa. Va bene? ma c'è un modo per fare senza impostare un timer perché eseguire l'operazione ogni 2 secondi può causare gravi problemi con il server? voglio solo sapere se c'è un modo migliore invece di impostare un timer?

Qualsiasi aiuto è molto apprezzato.

+0

Forse websockets? http://www.davesite.com/html5-code-tutorials/html5_interactive_intro_html_5/websockets/ –

+0

@niko stavo pensando lo stesso quando si trattava di usare gli aggiornamenti on-live basati su ajax e non riuscivo a trovare altre soluzioni. Non penso che ci possa essere una soluzione senza stabilire una connessione con il server. ma nella peggiore delle ipotesi è possibile aumentare l'intervallo di tempo da 2 a 4 o più – motto

risposta

9

Attualmente ciò che Facebook e Google impiegano, è una tecnica chiamata long polling.

È un sistema semplice in cui il client effettua una richiesta AJAX al server. Il server accetta la richiesta e controlla se ha i dati richiesti dalla richiesta. In caso contrario, la richiesta viene lasciata aperta ma differita dal server. Nel secondo il server ha i dati, la richiesta viene gestita e restituita al client.

Se apri Facebook, vedrai le richieste inviate su Facebook che richiedono circa 55 secondi. Lo stesso vale per Gmail e alcune altre applicazioni web che sembrano avere una sorta di sistema push.

Ecco un semplice esempio di come queste richieste potrebbero essere gestite:

  1. Cliente:

    • richiesta AJAX iniziale che ha il timestamp 0
  2. Server:

    • Confrontare la richiesta con timestamp 0 controllando la data/ora dei dati sul server. Diciamo che i dati sul server hanno il timestamp 234.
    • Il timbro del cliente è diverso dal timbro corrente sui dati del server, quindi torniamo con i nuovi dati.
  3. Cliente:

    • Cliente riceve i dati e subito inserisce un nuova richiesta AJAX con timestamp 234.
    • Quindi elaboriamo i nuovi dati e aggiorniamo la pagina Web in modo appropriato.
  4. Server:

    • confronto tra richiesta con timestamp 234 con il timbro attuale dei dati sul server.
    • I valori del timbro sono gli stessi, quindi andiamo a dormire.
    • I dati del server sono aggiornati e il valore del timbro è ora timestamp 235.
    • Le richieste di sospensione vengono riattivate e restituite con il valore di aggiornamento.

Si può leggere un altro in-depth spiegazione dei meccanismi più moderni per aggiornamenti in tempo reale.

+0

È semplice dal lato client, ma in molti framework Web in cui si scrive il codice per gestire la singola richiesta non è banale farlo in modo efficiente. – 6502

+0

C'è sicuramente una sincronizzazione e di solito c'è un certo grado di memorizzazione nella cache, ma non è sicuramente il problema di sincronizzazione più difficile da proporre. È impegnativo ma abbastanza semplice da essere divertente. Ovviamente la creazione di un modello efficiente come quello di Facebook o di Google non è la stessa. –

+0

In molti framework Web in cui ti viene semplicemente richiesto di scrivere una funzione che a fronte di una richiesta fornisce una risposta è semplicemente impossibile "dormire". In altri framework è possibile utilizzare tecniche di sospensione standard in cui è necessario un thread per ogni richiesta in sospeso, e questo è molto meno efficiente di quello necessario. Gestire il polling lungo in modo efficiente sul lato server (vale a dire senza un thread per richiesta in sospeso) è chiaramente possibile e anche divertente da fare ... ma "semplice" non è la parola che userei. – 6502

0

Solo i miei due centesimi, ma in precedenza ho risolto un problema simile avendo 2 servizi web. Fondamentalmente uno con un metodo lungo le linee di HaveNewData() e un altro GetData() (Nel mio caso ho avuto un numero di servizi Web che volevo chiamare).

Quindi, in pratica, chiamare regolarmente HaveNewData() (penso che in ogni caso ogni 2 secondi sia un disegno errato e non necessario) e restituisca un semplice 0 o 1 per questo metodo (dati minimi). Se HaveNewData() restituisce 1, quindi effettuare la chiamata al servizio web costoso. In alternativa, è possibile anche solo restituire un valore nullo nel servizio web primario quando non sono disponibili nuovi dati e nella mia esperienza questa scala almeno "carina" ragionevolmente.

0

Il polling lungo è una tecnica eccezionale ma, come con qualsiasi soluzione, l'efficacia dipende da molte variabili inclusa l'installazione dell'hardware e quindi non ci sono soluzioni assolute.

Si prega di essere consapevoli del fatto che il polling lungo si mantiene la connessione attiva che causa problemi di prestazioni con molti client.

soluzione

si dovrebbe prendere in considerazione: -

  1. Ha bisogno di essere quasi in tempo reale (per esempio uno StockTicker)
  2. Quanto spesso le ajax dati/uscita cambia (chat vs nuovo commento)
  3. Frequenza dell'evento che causa modifiche ai trigger di dati/output ajax. Questo determinerà come viene generata la cache.

Si dovrebbe essere un parsimonioso quando si tratta di ajax. La richiesta di risposta & deve essere eseguita in base alle necessità. Il successo di un'implementazione ajax sarà incompleto senza una soluzione di caching ben congegnata che sia più basata su eventi piuttosto che su richiesta.

Qui di seguito è una versione semplificata di una delle tecniche abbiamo trovato utile in un progetto: -

  1. Ogni richiesta sondaggio Ajax che è fatto conterrà output_hash che è il digest dei dati restituiti dal server in precedenza.
  2. Server controlla questo output_hash rispetto al recente hash dell'output che avrà generato, dall'origine dati preferibilmente memorizzata nella cache.
  3. Se è diverso, servirà il nuovo contenuto insieme al nuovo output_hash. Altrimenti una piccola risposta/Non modificato per indicare che non ci sono nuovi contenuti.

Nella nostra soluzione abbiamo anche eseguito il calcolo dinamico dell'intervallo del prossimo sondaggio. Mantenendo l'intervallo dinamico consente al server di controllare la richiesta.Ad esempio, supponiamo che la maggior parte dei commenti/risposte si verifichi nella prima ora, oltre al fatto che non vi è alcun punto che abbia il tempo di intervallo di 1 secondo, in modo che il server possa aumentare a 2,3 o 5 secondi in modo dinamico all'aumentare del tempo, piuttosto che hard codifica l'intervallo di 2 secondi. Allo stesso modo, il tempo di intervallo può essere diminuito se c'è una raffica di attività in un vecchio post.

Abbiamo anche controllato i client inattivi e altre cose.

Problemi correlati