AWS Kinesis, elaborazione Lambda simultanea con ordine garantito

Aug 19 2020

Ho un Lambda con un'origine evento che punta a un consumatore Kinesis Stream (con un numero arbitrario di frammenti)

Vorrei assicurarmi che gli elementi nel flusso con la stessa "chiave di partizione" vengano elaborati da Lambda in sequenza e non contemporaneamente. (Questo viene utilizzato come identità dell'oggetto e non voglio che più Lambda eseguano la logica sullo stesso oggetto contemporaneamente.)

Ad esempio, se gli elementi nel flusso hanno chiavi di partizione:

1,2,1,3,4,1,2,1

Se consideriamo l'ordine di elaborazione da sinistra a destra, Lambda elaborerà un elemento con ciascuna delle chiavi di partizione 1,2, 3 e 4 contemporaneamente. Quindi, quando ha terminato un elemento con una chiave di partizione specifica, può iniziare a elaborarne un altro con quella chiave.

Ciò è realizzabile in qualche modo, senza l'uso di un blocco distribuito che renderebbe inefficiente l'uso di Lambda?

Grazie

Risposte

numX Aug 20 2020 at 13:23

Sembra che stavo affrontando il problema nel modo sbagliato. Lambda garantisce che all'interno di uno shard, l'istanza Lambda venga richiamata su un batch alla volta. Pertanto, non è necessario un lock distribuito in quanto nel peggiore dei casi ci saranno più record appartenenti alla stessa entità nello stesso batch e l'elaborazione in ordine può essere gestita in memoria all'interno della funzione Lambda stessa.

Riferimento dalle domande frequenti di AWS http://aws.amazon.com/lambda/faqs/

D: In che modo AWS Lambda elabora i dati dagli stream Amazon Kinesis e dagli stream Amazon DynamoDB?

I record Amazon Kinesis e DynamoDB Streams inviati alla funzione AWS Lambda sono rigorosamente serializzati, per frammento. Ciò significa che se inserisci due record nello stesso frammento, Lambda garantisce che la tua funzione Lambda verrà richiamata correttamente con il primo record prima che venga richiamata con il secondo record . Se l'invocazione di un record scade, subisce una limitazione o incontra un altro errore, Lambda riprova fino a quando non riesce (o il record raggiunge la scadenza di 24 ore) prima di passare al record successivo. L'ordine dei record tra diversi frammenti non è garantito e l'elaborazione di ogni frammento avviene in parallelo.