Come migliorare le prestazioni [chiuso]

-2

In una delle mie interviste mi è stata fatta una domanda vaga, non sono ancora sicuro della risposta. Abbiamo un client e un server sono separati. La rete che li collega ha una latenza elevata, che sta dominando le prestazioni. Come possiamo migliorare le prestazioni. Si noti che non possiamo modificare la topologia della rete. Stavo pensando al caching, interrompendo la richiesta a più richieste minori e aprendo più connessioni con il server. Qualche idea?

Si noti che la descrizione della domanda è vaga e non sono stato fornito ulteriori informazioni sulla situazione.

Domanda chiarita: come deve essere progettata la comunicazione client-server per ottenere le migliori prestazioni su una rete con latenza elevata?

    
posta Mike G 06.02.2013 - 01:42
fonte

5 risposte

6

Se la latenza elevata sta peggiorando le prestazioni, farei esattamente l'opposto di quello che stai suggerendo: trova i modi per combinare più richieste in una singola richiesta.

Diciamo che la latenza è 1 secondo, ed è necessario elaborare 100 elementi e il tempo di elaborazione effettivo è di 0,01 secondi per elemento.

100 requests
============
Processing time = 0.01 * 100 =   1 second
Latency         = 1 * 100    = 100 seconds
Total time                   = 101 seconds

Ma se riesci a trovare un modo per inviare due elementi in una singola richiesta:

50 requests
============
Processing time = 0.01 * 100 =  1 second
Latency         = 1 * 50     = 50 seconds
Total time                   = 51 seconds

Congratulazioni! Hai appena tagliato il tempo di esecuzione per questo lotto a metà. Oppure, se riesci a trovare un modo per inviare tutti i 100 elementi in una singola richiesta:

1 request
============
Processing time = 0.01 * 100 = 1 second
Latency         = 1 * 1      = 1 second
Total time                   = 2 seconds

Come alcuni commentatori hanno notato, questo ha senso solo se il problema è in realtà latenza e non altri problemi relativi alla rete. Ma dal momento che è quello che ti è stato chiesto, questo è il modo giusto per gestirlo.

    
risposta data 06.02.2013 - 01:54
fonte
1

Carica più dati in primo piano in modo da non dover tornare indietro fino a quando non c'è un aggiornamento.

Utilizza un archivio dati locale e sincronizza se appropriato se si tratta di dati prevalentemente locali

Fai molte piccole richieste di targeting, piccoli dati che attraversano il filo

e compressione.

Probabilmente avrei pensato ad una risposta divertente ... la personalità ha una lunga strada.

"I'll just use my iPhone, i've got unlimited data and these 4g speeds are GREAT!"
    
risposta data 06.02.2013 - 01:57
fonte
1

Alcune idee che ti vengono in mente:

  1. Compressione: i dati vengono inviati avanti e indietro compressi per renderlo il più piccolo possibile?

  2. Caching: potrebbero esserci delle cache sul client per cercare di far apparire le cose più velocemente? Il sistema può essere configurato in modo che il client possa funzionare disconnesso dal server per un certo tempo?

  3. Connettività di rete - Sebbene non sia possibile modificare la topologia, potrebbe valere la pena di identificare se c'è qualcos'altro qui che potrebbe essere cambiato?

Anche se è una domanda aperta, c'è qualcosa da dire su ciò che è in questo sistema client / server. Ci sono chiamate al database? È prevista la sincronizzazione? Esistono architetture alternative che potrebbero funzionare meglio?

La domanda diventa quindi quanto può influire la compressione sulle cose. Se la compressione può significare che il centesimo o il millesimo di dati devono essere inviati sul filo, penserei che potrebbe essere un fattore in quanto l'invio di molto meno potrebbe cambiare le cose. Il problema con la domanda è che ci sono molte incognite.

    
risposta data 06.02.2013 - 01:53
fonte
1

Latenza e larghezza di banda sono due cose diverse; alta latenza significa che c'è un sovraccarico di tempo nell'invio di messaggi avanti e indietro, mentre bassa larghezza di banda significa che la pipeline ha un limite che limita il trasferimento di dati sincrono. Entrambi possono significare che ci vorrà un po 'per ottenere dati, ma per ragioni diverse.

La soluzione per latenza elevata se la larghezza di banda non è un problema è utilizzare richieste di dati più grandi; per quanto ne sai tu avrai bisogno, per minimizzare l'impatto additivo che avrà il ritardo del sovraccarico. La soluzione per la larghezza di banda ridotta se la latenza non è un problema è utilizzare le richieste di dati più piccole per i dati, il meno possibile con una sola volta, per ridurre il ritardo che è possibile aggiungere completamente un set di dati di grandi dimensioni . Inoltre, per entrambi i casi, dovresti lavorare nel modo più asincrono possibile, in modo che tu possa dare il feedback degli utenti mentre si sta verificando l'estrazione dei dati. Il caching è un'opzione se i dati sono relativamente statici e non sensibili (cioè chiunque altro possa entrare nel sistema potrebbe vedere esattamente gli stessi dati: ticker = cache, saldi del conto bancario = non cache).

    
risposta data 06.02.2013 - 03:21
fonte
0

Sulla rete con grande latenza, al primo posto devi organizzare i tuoi protocolli in modo asincrono. Ciò significa che devi provare a lavorare senza attendere la risposta del server.

Devi inviare le richieste e non aspettare la risposta. Quindi devi organizzare un thread separato o qualcosa che elabori le risposte quando arrivano.

In questo modo userete l'intera velocità della rete e otterrete le rispettive risposte solo in ritardo con il doppio del tempo di latenza.

Naturalmente, è possibile solo se le richieste non dipendono l'una dall'altra e questo è il tuo compito di progettare questo flusso di lavoro dell'applicazione.

    
risposta data 06.02.2013 - 02:31
fonte

Leggi altre domande sui tag