Streams do DynamoDB com o Lambda, como processar mensagens relacionadas em ordem?

1

Eu quero usar o DynamoDB Streams + AWS Lambda para processar mensagens de bate-papo. Mensagens relacionadas à mesma conversa user_idX: user_idY (uma sala) devem ser processadas em ordem. A ordenação global não é importante.

Assumindo que eu alimentei o DynamoDB na ordem correta (room: msg1, room: msg2, etc), como garantir que o Stream alimentará o AWS Lambda sequencialmente, com garantia do processamento de mensagens relacionadas (espaço ) através de um único fluxo ?

Exemplo, considerando que eu tenho 2 fragmentos, como ter certeza de que o grupo lógico vai para o mesmo fragmento?

Eu preciso fazer isso:

Shard 1: 12:12:msg3 12:12:msg2 12:12:msg1 ==> consumer
Shard 2: 13:24:msg2 51:91:msg3 13:24:msg1 51:92:msg2 51:92:msg1 ==> consumer

E não isso (as mensagens estão respeitando a ordem que salvei no banco de dados, mas elas estão sendo colocadas em diferentes shards, processando incorretamente sequências diferentes para a mesma sala em paralelo):

Shard 1: 13:24:msg2 51:92:msg2 12:12:msg2 51:92:msg2 12:12:msg1 ==> consumer
Shard 2: 51:91:msg3 12:12:msg3 13:24:msg1 51:92:msg1 ==> consumer

Esta postagem oficial menciona isso, mas não consegui encontrar em nenhum lugar nos documentos como implementá-lo:

The relative ordering of a sequence of changes made to a single primary key will be preserved within a shard. Further, a given key will be present in at most one of a set of sibling shards that are active at a given point in time. As a result, your code can simply process the stream records within a shard in order to accurately track changes to an item.

Perguntas

1) Como definir uma chave de partição nos Streams do DynamoDB?

2) Como criar shards de fluxo que garantem a entrega consistente da chave de partição?

3) Isso é realmente possível afinal? Desde que o artigo oficial menciona: uma determinada chave estará presente em no máximo um de um conjunto de shards irmãos que estão ativos em um determinado ponto no tempo então parece que msg1 pode ir para shard 1 e depois msg2 para shard 2, como no meu exemplo acima?

4) Em esta pergunta, eu achei isso:

The amount of shards that your stream has, is based on the amount of partitions the table has. So if you have a DDB table with 4 partitions, then your stream will have 4 shards. Each shard corresponds to a specific partition, so given that all items with the same partition key should be present in the same partition, it also means that those items will be present in the same shard.

Isso significa que posso alcançar o que preciso automaticamente? "Todos os itens com a mesma partição estarão presentes no mesmo fragmento" . O Lambda respeita isso?

5) Da FAQ :

The ordering of records across different shards is not guaranteed, and processing of each shard happens in parallel.

Eu não me importo com ordenação global, apenas lógica como por exemplo. Ainda assim, não está claro se os shards se agrupam logicamente com essa resposta do FAQ.

    
por AlfredBaudisch 13.01.2017 / 14:08

1 resposta

0

Esta resposta ajuda?

link

The ordering of records across different shards is not guaranteed, and processing of each shard happens in parallel.

    
por 11.09.2017 / 21:21