Questões

Questões

Quero usar DynamoDB Streams + AWS Lambda para processar mensagens de bate-papo. Mensagens sobre a mesma conversauser_idX:user_idY(um quarto) deve ser processado em ordem. A ordem global não é importante.

Supondo que eu alimente o DynamoDB na ordem correta (room:msg1, room:msg2, etc), como garantir que o Stream alimentará o AWS Lambda sequencialmente, comordenação garantida do processamento de mensagens relacionadas (sala) em um único fluxo?

Exemplo, considerando que tenho 2 fragmentos, como garantir que o grupo lógico vá para o mesmo fragmento?

Devo realizar 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 estão sendo colocadas em shards diferentes, 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

Este oficialpublicarmenciona isso, mas não consegui encontrar em nenhum lugar dos documentos como implementá-lo:

A ordem relativa de uma sequência de alterações feitas em uma única chave primária será preservada em um fragmento. Além disso, uma determinada chave estará presente no máximo em um conjunto de fragmentos irmãos que estão ativos em um determinado momento. Como resultado, seu código pode simplesmente processar os registros de fluxo dentro de um fragmento para rastrear com precisão as alterações em um item.

Questões

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

2) Como criar fragmentos de Stream que garantam entrega consistente de chaves de partição?

3) Afinal, isso é realmente possível? Já que o artigo oficial menciona:uma determinada chave estará presente em no máximo um conjunto de fragmentos irmãos que estão ativos em um determinado momentoentão parece que msg1 pode ir para o fragmento 1 e depois msg2 para o fragmento 2, como meu exemplo acima?

4) Emessepergunta, encontrei isto:

A quantidade de fragmentos que seu stream possui é baseada na quantidade de partições que a tabela possui. Portanto, se você tiver uma tabela DDB com 4 partições, seu stream terá 4 fragmentos. Cada fragmento corresponde a uma partição específica, portanto, dado que todos os itens com a mesma chave de partição devem estar presentes na mesma partição, isso também significa que esses itens estarão presentes no mesmo fragmento.

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

5) DoPerguntas frequentes:

A ordem dos registros em diferentes fragmentos não é garantida e o processamento de cada fragmento acontece em paralelo.

Não me importo com a ordem global, apenas com a lógica, como por exemplo. Ainda assim, não está claro se os fragmentos se agrupam logicamente com esta resposta do FAQ.

Responder1

Esta resposta ajuda?

https://stackoverflow.com/questions/44266633/how-do-dynamodb-streams-distribute-records-to-shards

A ordem dos registros em diferentes fragmentos não é garantida e o processamento de cada fragmento acontece em paralelo.

informação relacionada