Come migliorare il valore di timeout in modo dinamico?

3

Sto lavorando su un'applicazione in cui voglio mantenere un valore di timeout calcolato in modo dinamico utilizzando una media mobile di circa 100 precedenti tempi di risposta per il servizio A.

Questo value + some buffer (~3 seconds) verrà utilizzato come timeout per le richieste di rete per il servizio A. Il problema qui è che voglio che questo timeout migliori con le caratteristiche della rete - questo non è un problema quando l'utente passa da una rete lenta a una rete più veloce, ma nel caso opposto, il timeout dovrebbe aumentare gradualmente, eccetto negli scenari in cui la connessione era imprevedibile (come in un garage), nel qual caso non voglio che questo timeout aumenti poiché questo è transitorio.

Non sono sicuro se sia persino possibile distinguere tra i 2 casi sopra menzionati. Anche se no, cosa dovrei registrare come tempo di risposta quando una richiesta è scaduta? Stavo pensando di registrare (currentTimeoutValue + 2) secondi, questo funziona bene per il caso di garage (non spinge la media in modo drammatico), ma se qualcuno si troverà su una rete più lenta per un po ', ci vorranno molte più richieste scadute per raggiungere la velocità attuale della rete.

Qualsiasi suggerimento è apprezzato.

    
posta Armageddon 04.05.2016 - 05:39
fonte

2 risposte

2

Con la media mobile, non è possibile identificare facilmente le variazioni rapide. Per costruzione, la curva della media mobile appiattisce / uniforma sempre la realtà. Reagirà per cambiare le tendenze con un time shift. Più lunga è la durata media mobile, più lungo è il turno.

Ecco come il timeout basato sulla media mobile potrebbe evolversi in due situazioni: 1) con un aumento lento e 2) con un cambio rapido, ad esempio quando si passa un tunnel con il telefono o se ci si trova in una ascensore:

Ci sarà un timeout, solo se il tempo di risposta aumenta abbastanza velocemente da bruciare il tempo di buffer. Ma non è possibile con una media mobile notare se l'aumento del tempo di risposta è veloce o no, perché è una media.

Puoi rendere il tuo adattamento del timeout più consapevole della brutalità del cambiamento usando una seconda media mobile: la prima media i 100 ultimi tempi di risposta e la seconda solo i 10 o gli ultimi 20. Confrontando i due puoi farti un'idea di quanto sia brutale il cambiamento e adattare la reazione:

  • applica l'algoritmo in modo coerente per una degradazione lenta (fig 1)
  • sospende l'aggiornamento della prima media mobile e utilizza una strategia di fallback (fig. 2). Ad esempio, puoi utilizzare un valore fisso in caso di garage o tunnel oppure passare temporaneamente alla seconda media mobile e aggiungere un buffer più alto.

Ovviamente dovrai perfezionare la differenza tra la media mobile e quella pertinente per effettuare il passaggio.

    
risposta data 01.10.2016 - 12:43
fonte
1

Presumo che si tratti di un'applicazione su un dispositivo mobile che tenta di chiamare il servizio. Se il tuo dispositivo mobile è in grado di rilevare la differenza tra "nessuna rete disponibile" e "rete disponibile (anche se lenta)", allora ti trovi in una situazione molto migliore, poiché se la rete non è disponibile, semplicemente non cambi il timeout.

Per l'altro, caso "standard", puoi provare qualcosa come

 newTimeout = (currentTimeout + 1) * c 

dove c è un valore compreso tra 1 e 2, ogni volta che il tempo di risposta viene superato e applica la "media mobile" solo quando il tempo di risposta non viene superato. Inoltre, dovrebbe essere chiaro che dovresti mantenere il timeout massimo al di sotto di un ragionevole limite superiore per evitare che converta all'infinito.

    
risposta data 04.05.2016 - 08:28
fonte

Leggi altre domande sui tag