Come ottimizzo un'applicazione Web per utenti con latenza elevata?

6

Fondamentalmente, ho un'applicazione che esegue ricerche e richiede risultati da un back-end tramite polling lungo. Si connette al backend che raccoglie i risultati per 500 ms e li rimanda al client (sto semplificando le cose qui un po 'di corso). Poiché abbiamo ottimizzato questo aspetto, abbiamo notato una crescente divisione tra gli utenti che effettuano ricerche notturne rispetto agli utenti che effettuano ricerche durante il giorno. In particolare, gli utenti che effettuano ricerche di notte sono molto più lenti rispetto agli utenti che effettuano ricerche durante il giorno a causa del fatto che questi utenti sono per lo più internazionali e hanno una latenza più elevata.

Quali sono i buoni approcci di alto livello per accelerare le cose per questi utenti?

    
posta Jason Baker 22.09.2011 - 01:45
fonte

2 risposte

6

Devi analizzare il tuo codice cercando "turnaround". Un inversione di tendenza è un caso in cui i progressi in avanti sono bloccati fino a quando i dati non possono essere ricevuti dall'altro lato. Ogni tempo di risposta aggiunge una penalità alle prestazioni che si adegua alla latenza. Quindi se hai 12 turnaround, 100 ms di latenza in più significa 1,2 secondi di attesa. Se riesci a ridurre i tempi di risposta a 4, 100 ms di latenza aggiuntiva significa solo 4 secondi di attesa in più.

Alcuni turnaround sono espliciti. Se invii una richiesta e aspetti una risposta, è un inversione di tendenza. Se hai bisogno di vedere quella risposta per decidere quale sarà la prossima richiesta, è un inversione di tendenza.

Alcuni rigiri sono impliciti. Se apri una connessione TCP e attendi per determinare se l'apertura è riuscita, è un inversione di tendenza. Se chiudi una connessione TCP e aspetti che la chiusura sia completa senza errori, è una soluzione.

Trovare e misurare i turnaround è un po 'un'arte nera. Ma un trucco che puoi usare è un simulatore di latenza (Linux può farlo con netem ). Se è possibile aggiungere la registrazione con timestamp o altrimenti dire cosa sta succedendo, è possibile aggiungere un simulatore di latenza di 4 secondi (un dispositivo che aggiunge 4 secondi di ritardo ad ogni pacchetto che lo attraversa). Ogni 4 secondi che spendi in attesa di qualcosa è un ritorno. Puoi contarli e puoi anche vedere dove cadono nel tuo processo operativo.

Il codice che non è mai stato ottimizzato per i turnaround ha spesso un numero elevato di turnaround inutili. In genere, sono invisibili negli ambienti di test perché in genere questi ambienti dispongono del client e del server sulla stessa LAN o, nella peggiore delle ipotesi, molto vicino su una WAN veloce.

Ci sono quattro modi fondamentali per eliminare un inversione di tendenza. Uno è il pipelining - questo in pratica significa solo che non si aspetta una risposta se non è necessario. Puoi tornare indietro e controllare i risultati più tardi. Un altro è il consolidamento: se al momento hai bisogno di due richieste per eseguire alcune operazioni di livello superiore e la riduci a una richiesta, significa che è stato risolto un problema. La terza via è la concorrenza: se riesci a fare più di una cosa alla volta, questo è un capovolgimento andato. L'ultimo è il prefetching: se si conosce un elemento della pagina Web che si sta per caricare è necessario caricare il contenuto di un altro URL, è possibile iniziare a recuperare tale URL mentre si carica la pagina Web che ne ha bisogno.

    
risposta data 22.09.2011 - 07:39
fonte
0

Riduci la quantità di dati che stai inviando.

Alcune idee che potrebbero aiutarti:

  • Presta molta attenzione allo spazio bianco nel tuo html
  • Abilita la compressione nel tuo server web per le pagine statiche
  • Suddividi le tue risposte in modo che possano essere inviate gradualmente all'utente
  • Implementa una schermata animata di attesa / caricamento, che è veloce da trasferire
risposta data 22.09.2011 - 03:11
fonte

Leggi altre domande sui tag