AWines Kinesis garantisce un tipo specifico di ordinamento?

2

Da AWS documentazione :

A Kinesis data stream is an ordered sequence of data records. Each record in the stream has a sequence number that is assigned by Kinesis Data Streams

Non vedo alcuna connessione tra queste 2 frasi. Inoltre, la documentazione non specifica esplicitamente il tipo di ordinamento.

Dopo una piccola indagine, ho scoperto che se stiamo usando la libreria di produttori AWS (ad esempio, KPL ), l'ordine che la lib ha inviato correttamente ai record di Kinesis viene mantenuto quando si utilizza da Kinesis. Il problema è che questo ordine di record non garantisce di essere uguale all'ordine dei record che ho inviato a qualsiasi libreria.

Application -(1)> KPL -(2)> Kinesis

L'ordine è determinato dalla sequenza di record che è stata inviata con successo da KPL a Kinesis. (In caso di errori di rete, verrà inviato di nuovo un record da KPL, dopo l'invio di altri record).

Una definizione della parola a caso è qui :

Of or relating to an event in which all outcomes are equally likely...

La mia conclusione è che un'applicazione invia i record al kinesis in un ordine casuale, il che significa che non esiste alcun ordine. Nel caso in cui un'applicazione debba garantire qualsiasi tipo di ordine, deve creare la propria libreria e non usarne la.

Mi manca qualcosa qui?

    
posta Stav Alfi 26.02.2018 - 07:39
fonte

1 risposta

4

Il termine che userei è "arbitrario" piuttosto che "casuale". Ma la tua osservazione è corretta: i numeri di sequenza indicano semplicemente la sequenza in cui i record sono stati aggiunti alla partizione. Servono a permettere ai consumatori di continuare a leggere da dove si erano interrotti (usando un AFTER_SEQUENCE_NUMBER shard iterator), per non riflettere il senso dell'ordine del produttore. Il problema diventa più difficile quando si introducono più frammenti e si distribuiscono le proprie scritture utilizzando le chiavi di partizione.

Questo è un problema con qualsiasi sistema distribuito dove ci sono più percorsi dall'origine alla destinazione: non puoi garantire l'ordine attraverso il sistema (beh, non senza un lotto di sforzo).

Quindi la soluzione è registrare l'ordine prima di inserire i record nel sistema. Supponendo che l'applicazione sia in grado di mantenere l'ordine fino al punto in cui i record vengono scritti nello stream (e questo è raramente vero!), È possibile aggiungere un numero di sequenza a ciascun record (questo deve essere parte del carico utile scritto per Kinesis).

Quindi il lettore deve riapplicare l'ordine in base a quei numeri di sequenza. Questo non è un problema completamente intrattabile: i record che sono stati ordinati prima di essere scritti nello stream di solito dovrebbero essere vicini l'uno all'altro quando letti dallo stream (quindi ordine arbitrario , non random ). Pertanto, devi conservare i record in memoria finché non hai accumulato una sequenza ininterrotta, quindi passali a qualsiasi elaborazione li stia elaborando.

    
risposta data 27.02.2018 - 01:07
fonte

Leggi altre domande sui tag