Ho cercato di calcolare un modo di calcolare il tempo rimanente stimato per un articolo in una coda quando ci sono più lavoratori che elaborano gli articoli dalla singola coda.
Un client inoltra un lavoro alla coda, ma poiché l'elaborazione può richiedere del tempo, desidero fornire una stima del feedback.
Lo so
- Numero di elementi nella coda
- Posizione in coda
- Durata del processo di elaborazione di un elemento *
- Quanti lavoratori sono in esecuzione
- Quando ogni lavoratore ha completato un lavoro
Non lo so
- Quanto è lungo l'elaborazione del worker, solo quando inizia e finisce **
* Il tempo di elaborazione è il tempo di elaborazione del 90 ° percentile dei lavori passati in un intervallo di tempo ragionevole. Non completamente accurato, ma tende a sovrastimare leggermente ed è abbastanza preciso per le mie esigenze.
** I lavoratori chiamano un servizio esterno, quindi la migliore stima del progresso è il tempo impiegato
Con un singolo lavoratore posso usare una funzione come
estimated_seconds_remaining = (
(position_in_queue + 1) * average_processing_time_seconds
) - (
average_processing_time_seconds - time_since_worker_last_finished_seconds
)
(position_in_queue + 1) * average_processing_time_seconds
mi dà il tempo necessario per elaborare tutti gli elementi nella coda più quello che è attualmente in fase di elaborazione, quindi togliere average_processing_time_seconds - time_since_worker_last_finished_seconds
mi dà il tempo rimanente stimato per elaborare l'elemento corrente della coda.
Funziona abbastanza bene ed è sufficientemente accurato per la segnalazione in quanto la variazione dei tempi di elaborazione è piuttosto ridotta.
Tuttavia, in produzione eseguirò più worker, quindi più worker elaboreranno gli articoli dalla stessa coda. Molto probabilmente ci saranno 3 o 4 lavoratori in esecuzione, ma a volte potrebbero essere in aumento di 10.
L'opzione più semplice è solo modificare la mia formula in modo
estimated_seconds_remaining = (
(position_in_queue + 1)/number_of_workers * average_processing_time_seconds
) - (
average_processing_time_seconds/number_of_workers - time_since_worker_last_finished_seconds
)
Ma questo fornisce previsioni imprecise e errate, dal momento che le stime vengono ricalcolate ogni secondo per aggiornare la visualizzazione, i tempi salgono e scendono secondo quando i lavoratori finiscono tutti i loro lavori.
C'è un modo semplice, con le informazioni che ho, di calcolare una previsione ragionevolmente accurata del tempo rimanente prima che un articolo dalla coda venga elaborato?