Esistono algoritmi per l'ottimizzazione del polling?

3

Ho un'applicazione web con un backend HTTP asincrono, che viene chiamato dal client dalle richieste AJAX. Il cliente deve iniziare un lavoro e quindi esegue il polling per il risultato.

Ho iniziato con un semplice intervallo di polling di 150 ms, che andava bene per piccoli lavori, ma i lavori di grandi dimensioni, che potevano richiedere diversi minuti, hanno gettato molte richieste non riuscite al server.

Attualmente aggiungo 1000 ms al ritardo dopo ogni sondaggio, quindi il polling si allunga nel tempo per richieste più lunghe, ma mai più di 10 secondi.

Esistono alcune formule, statistiche o algoritmi che posso utilizzare per ottimizzare dinamicamente il tempo di polling?

    
posta K.. 10.07.2013 - 14:33
fonte

3 risposte

4

Se il server può fornire una stima approssimativa della durata del lavoro, restituirò tale stima nella prima risposta (quella che indica che il lavoro è stato ricevuto / accettato). Il client può quindi attendere almeno quella volta prima che inizi a eseguire il polling dei risultati.

Per evitare di sovraccaricare un server con richieste di polling non riuscite, è possibile utilizzare anche uno schema che viene spesso utilizzato per inviare tentativi su un protocollo inaffidabile: dopo aver inviato una richiesta, attendere un tempo T prima di inviare un nuovo tentativo. Dopo aver inviato un tentativo, raddoppia il tempo di attesa, fino a un T2 massimo. Dopo il successo, il tempo di attesa viene ripristinato sul valore predefinito (minimo) T1. Ad esempio, potresti utilizzare i valori T1 = 250ms e T2 = 16s

Ad esempio, ecco come sarà il sondaggio per un lavoro che è stimato in 2 minuti e viene eseguito un po 'in ritardo (latenza di rete ignorata):

Time             Action/Reply
----             ------------
0:00.000         Start job. Server responds with a duration of 2:00 minutes
2:00.000         Polling starts. Server responds job still running
2:00.250         First retry. Job still running
2:00.750         Second retry. Job still running
2:01.429             Job finishes
2:01.750         Third retry. Job reported as done.

Come puoi vedere, c'è una certa latenza nel riportare che il lavoro è stato eseguito, ma cos'è un ritardo di alcune centinaia di millisecondi se stavi già aspettando 2 minuti per il completamento del lavoro?

    
risposta data 10.07.2013 - 15:01
fonte
2

Dipende molto da quanto tempo ci vuole in media per eseguire il lavoro e la deviazione standard di questo tempo.

Una volta che lo sai, hai una buona idea di quali sono i tuoi tempi di attesa minimi e massimi per il 95% dei lavori (2 deviazioni standard). Quindi pianificherei per un tempo minimo di polling da qualche parte nelle vicinanze di 2 deviazioni standard (quindi statisticamente, solo il 5% dei lavori è finito a questo punto).

Da lì, dipende in gran parte da te, ma idealmente ti piacerebbe sondare con maggiore frequenza mentre ti avvicini alla norma e poi cadi in seguito. Non posso dirti a quale velocità dovresti effettuare il polling del server, poiché sei tu a determinare il volume di traffico che puoi supportare. Hai preso in considerazione anche le prese sul web?

    
risposta data 10.07.2013 - 14:57
fonte
1

Un'opzione alternativa è usare qualcosa come polling lungo o websocket. In questo modo è possibile sostituire sbattendo il server con più "è già fatto?" richieste con una singola richiesta "dimmi quando hai finito"

    
risposta data 10.07.2013 - 16:04
fonte

Leggi altre domande sui tag