Avviso quando la dimensione del flusso continuo di eventi supera 1000

0

Recentemente una mia amica mi ha fatto questa domanda in un'intervista.

Lets say there is a continuous stream of incoming events E1, E2 each with timestamp of entry associated with them. Write a java module to Make a call to raiseAlert() if at any point of time there are more than 1000 elements incoming at the same time. Remember its a continuous stream. Assume there is a getnextevent() to process incoming events

Quale sarebbe la soluzione migliore (ha detto la coda con un monitoraggio dei timestamp davanti e dietro) e come sarebbe il modulo in Java?

    
posta Slartibartfast 05.05.2016 - 10:40
fonte

1 risposta

1

Per la domanda come posta, una coda funzionerebbe OK. Anche se il monitoraggio dovrebbe includere anche il numero totale di eventi in coda. Il monitoraggio dei timestamp della testa e della coda è facoltativo, forse un bel-to-have. Un Java BlockingQueue offre la maggior parte delle cose di cui abbiamo bisogno. Il lato rete può utilizzare [ offer ] ( link , long, java.util.concurrent.TimeUnit)) metodo per accodare nuovi elementi. Il lato codice server utilizza poll se questa è l'unica coda che serve.

Tuttavia, l'implementazione dovrebbe tenere traccia indipendentemente della dimensione poiché il metodo size() esistente restituisce sempre zero. Quindi dovresti anche proteggere il membro dei dati di dimensione con un mutex.

Non scriveremo il codice per te, questo non è il punto di questo forum StackExchange.

Ma la premessa della domanda è, molto sottilmente, sbagliata. Il contesto è che siamo preoccupati per il sovraccarico (ad esempio troppi eventi sono in coda). Supponendo che le richieste in arrivo abbiano una scadenza, se si utilizza una coda, ogni evento che viene offerto dalla coda è sempre l'evento più vecchio nella coda, in base alla progettazione. Questo massimizza la possibilità di superare la scadenza prima ancora di guardarla.

Se il tuo server non è sovraccarico (cioè sta elaborando eventi con la stessa rapidità con cui arrivano) ci saranno zero eventi nella tua struttura dati. Pertanto, la progettazione e il dimensionamento della struttura dei dati sono davvero rilevanti solo per la gestione delle condizioni di sovraccarico.

Ci sono due semplici correzioni per il nostro problema, una utile dove gli eventi devono essere elaborati in ordine, e l'altro dove questa restrizione non esiste.

Per garantire un'elaborazione in ordine, è sufficiente ridurre di molto la lunghezza della coda. Puoi utilizzare la Legge di Little per capire quale coda di dimensioni usare dato il tempo medio per servire una richiesta, le richieste 'la scadenza abituale e il throughput obiettivo. L'unico vero scopo della coda è gestire i picchi nelle richieste in entrata (nota: la legge di Little non è valida per i transienti). Il vantaggio della coda più breve è che quando una richiesta arriva dopo che la coda è già piena, il server non dà l'impressione fuorviante che avrà a che fare con esso. A seconda del livello di trasporto, il cliente potrebbe anche ricevere una notifica che il proprio evento non può essere servito in questo momento. In ogni caso, chiameresti semplicemente raiseAlert quando non riesci ad accodare un evento.

Se l'elaborazione in ordine non è richiesta, c'è una tecnica migliore, ma meno intuitiva: usa uno stack invece di una coda . Che differenza fa? Assente quando il server elabora gli eventi con la stessa velocità con cui arrivano. Se ci sono zero eventi, non importa se si tratta di una coda o di uno stack, si comporta allo stesso modo (dal momento che non fa nulla). Non appena abbiamo un sovraccarico, con uno stack abbiamo un invariante che il server elabora sempre l'evento più recente , che è l'evento con la minima possibilità di aver già superato la sua scadenza. Ciò massimizza la percentuale di richieste client che non scadono.

Se è economico distruggere gli oggetti richiesta (in particolare: molto più economico della gestione effettiva della richiesta), puoi implementare lo stack con un dequante e eseguire il polling bottom dello stack per gli eventi scaduti, in per scartarli. Ciò consente di controllare in qualche modo la pressione della memoria in condizioni di sovraccarico.

    
risposta data 05.05.2016 - 11:03
fonte

Leggi altre domande sui tag