Costruire un'API in tempo reale su una struttura Kafka / Kinesis-centrica

1

Sono un principiante dell'architettura dei dati basata su eventi che usa Kafka / Kinesis come fulcro (attualmente Kinesis) e ho alcune domande su come costruire un'API WebSocket su tale struttura. Il mio caso d'uso specifico è che ho circa 4 diversi flussi di dati in arrivo in Kinesis, li combino in un "flusso aggregato" dopo aver eseguito qualche elaborazione, e poi memorizzo il risultato di tale flusso in un DB distribuito per scopi storici. Viene anche emesso come un altro stream Kinesis per altri utenti.

Il mio obiettivo è che voglio che questo flusso finale di dati sia consegnato a un client Web in tempo reale e che il client sia in grado di vedere i dati storici del flusso. Ho un paio di domande su come dovrei progettare un sistema del genere.

  1. L'API dovrebbe consumare direttamente il flusso Kinesis e inoltrare i messaggi al client? O è meglio avere un middle layer che si trova tra lo stream Kinesis e il client API per gestire alcuni stati.
  2. Qual è l'approccio consigliato per gestire il replay? Supponiamo che un client perda la connessione allo stream e ritorni 5 minuti dopo. Come posso tenere traccia di dove il cliente si è interrotto in modo da poter riprodurre quegli eventi e poi recuperare il "capo" del flusso?
  3. Basandosi su 2., dovrei avere una sorta di meccanismo di checkpoint sullo stream dove qualsiasi cosa prima del checkpoint si troverebbe nel database distribuito e dopo tutto quello che sarebbe stato riprodotto?
  4. Dovrei persino provare a implementare una funzionalità di replay e piuttosto a scrivere in modo aggressivo sul DB distribuito in modo che il DB distribuito abbia una registrazione costante dello stato vero? Allora forse sul client si potrebbe fare un semplice sondaggio del database. Credo che questo sia un po 'imbroglio però.

Grazie per il tuo aiuto!

    
posta coolboyjules 19.03.2018 - 02:45
fonte

1 risposta

1

Should the API directly consume the Kinesis stream and relay the messages to the client? Or is it better to have a middle layer that sits between the Kinesis stream and the API client to manage some state.

La risposta a questo dipende dalle risposte alle altre domande.

What is the recommended approach to manage replay? Suppose a client loses connection to the stream and returns 5 minutes later. How can I keep track of where the client left off so I can replay those events and then catch-up to the 'head' of the stream?

Ogni consumatore di stream dovrebbe tenere traccia di ciò che era lo sfalsamento / id / timestamp dell'ultimo messaggio consumato con successo. Al riavvio, si riavvierà dal prossimo offset / id / timestamp. Quando si utilizza Kafka questo è qualcosa che gestisci interamente te stesso nel codice del consumatore, o è qualcosa che l'SDK del client Kafka gestisce per te memorizzando gli offset consumati in zookeeper (vecchio client) o in un argomento kafka (nuovo client). Un client consumer kafka durante la riconnessione specifica gli offset di partizione da cui desidera iniziare la lettura.

Il vantaggio di questo approccio è che copre lo scenario problematico di "leggere il messaggio ma non è in grado di elaborare" e che sposta la complessità della gestione dello stato consumatore nei consumatori (liberi di scegliere di riavviare dagli ultimi offset consumati , o ricomincia dall'ultima, a seconda del caso d'uso specifico).

    
risposta data 19.03.2018 - 13:08
fonte

Leggi altre domande sui tag