Diffusione dei dati batch in entrata in un flusso in tempo reale

0

Vorrei mostrare alcuni eventi in "tempo reale". Tuttavia, devo recuperare i dati da un'altra fonte. Posso richiedere gli ultimi X minuti, anche se la sorgente viene aggiornata approssimativamente ogni 5 minuti. Ciò significa che ci sarà un ritardo tra i dati più recenti recuperati e il momento in cui faccio la richiesta.

In secondo luogo, perché riceverò una serie di dati, non voglio semplicemente spegnere tutti gli eventi giù da una presa una volta che il mio fetcher l'ha recuperata: mi piacerebbe distribuire gli eventi in modo che siano entrambi accuratamente distanziati tra loro e in sincrono con le loro occorrenze originali (ad esempio, un evento viene sempre visualizzato 6 minuti dopo che è effettivamente avvenuto).

Il mio pensiero è di recuperare i dati ogni 5 minuti dalla fonte, sapendo che non otterrò i dati più recenti. I dati originali verranno quindi accodati per essere inviati al socket a 7,5 minuti dal timestamp originale, ovvero a circa 2,5 minuti da quando è stato recuperato il suo batch e al massimo 7,5 minuti da allora.

La mia domanda è questa: è questo il modo migliore per affrontare il problema? Questo problema presenta approcci standard o letteratura associata relativi alle best practice di implementazione e ai casi limite?

Sono un po 'preoccupato che la frequenza dei miei recuperi e la frequenza con cui la sorgente viene aggiornata andranno fuori sincrono, portando a punti in cui nessun dato sarà recuperato dalla fonte. Tuttavia, poiché il ritardo del socket è maggiore della frequenza di recupero, il recupero successivo dovrebbe recuperare i dati più recenti prima che la coda del socket sia vuota.

È corretto? Mi manca qualcosa?

Grazie!

    
posta pr1001 05.03.2014 - 14:00
fonte

1 risposta

-1

Questo sembra simile a qualcosa che ho avuto a che fare. Nel mio caso: query che possono richiedere minuti prima della fine (a causa della complessità) e richieste che dovrebbero ottenere una risposta praticabile il prima possibile.

Sembra che tu abbia un ritardo intenzionale nella trasmissione dei dati. Probabilmente per soddisfare la situazione "in tempo reale" che hai con frequenti aggiornamenti.

Abbiamo fatto una soluzione "dammi quello che hai" dove il server avrebbe messo la richiesta in uno stato di arresto finché almeno un record era lì.

Quindi elaboreremo il risultato (uno o più record) e eseguiremo il polling per la successiva serie di record disponibili che potrebbero o non potrebbero essere trasmessi da un'altra fonte a quel server.

Problemi risolti dalla nostra parte: 1: connessioni lente / molto tempo prima che una connessione sia effettivamente stabilita 2: risposta lenta / molto tempo prima che uno o più record siano disponibili.

Se il tempo per creare una connessione è lungo e la quantità di record X in streaming di origine (da 1 a N) otterremmo ciò che è presente.

Se il tempo per costruire una connessione è veloce, otterremmo almeno uno e forse N record.

Nel tuo caso, potresti voler creare un timer interno e un Data Store interno in cui puoi eseguire query e pulire l'archivio dati su "tutti i record precedenti a X minuti". Riempi lo Store con qualunque sia la fonte dei dati che ti fornisce e poi recuperi e cancelli tutto ciò che è conforme alle tue esigenze. Tutti gli oggetti / record "troppo freschi" verranno ignorati e sarà possibile eseguire questo processo senza una strong dipendenza dal lato recupero / trasmissione.

Ottieni semplicemente ciò che puoi ottenere e trasmetti tutto ciò che si applica al tuo filtro (in due processi separati)

Poiché i tuoi record sono contrassegnati dal timestamp e forniscono già dati rigidi sul loro punto di creazione, puoi mantenerli abbastanza semplici.

    
risposta data 05.03.2014 - 18:46
fonte

Leggi altre domande sui tag