
Quiero usar DynamoDB Streams + AWS Lambda para procesar mensajes de chat. Mensajes sobre la misma conversación.id_usuarioX:id_usuarioY(una habitación) debe procesarse en orden. El orden global no es importante.
Suponiendo que alimento DynamoDB en el orden correcto (sala:msg1, sala:msg2, etc.), ¿cómo garantizar que Stream alimentará AWS Lambda secuencialmente, conOrden garantizado del procesamiento de mensajes relacionados (sala) en un solo flujo.?
Por ejemplo, considerando que tengo 2 fragmentos, ¿cómo asegurarme de que el grupo lógico vaya al mismo fragmento?
Debo lograr esto:
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
Y no esto (los mensajes respetan el orden que guardé en la base de datos, pero se colocan en fragmentos diferentes, procesando incorrectamente diferentes secuencias para la misma sala en 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 funcionariocorreomenciona esto, pero no pude encontrar en ninguna parte de los documentos cómo implementarlo:
El orden relativo de una secuencia de cambios realizados en una única clave primaria se conservará dentro de un fragmento. Además, una clave determinada estará presente como máximo en uno de un conjunto de fragmentos hermanos que están activos en un momento determinado. Como resultado, su código puede simplemente procesar los registros de flujo dentro de un fragmento para realizar un seguimiento preciso de los cambios en un elemento.
Preguntas
1) ¿Cómo configurar una clave de partición en DynamoDB Streams?
2) ¿Cómo crear fragmentos de Stream que garanticen una entrega coherente de la clave de partición?
3) ¿Es esto realmente posible después de todo? Dado que el artículo oficial menciona:una clave determinada estará presente como máximo en uno de un conjunto de fragmentos hermanos que están activos en un momento determinadoEntonces, ¿parece que msg1 puede ir al fragmento 1 y luego msg2 al fragmento 2, como en mi ejemplo anterior?
4) enestepregunta, encontré esto:
La cantidad de fragmentos que tiene su transmisión se basa en la cantidad de particiones que tiene la tabla. Entonces, si tiene una tabla DDB con 4 particiones, entonces su transmisión tendrá 4 fragmentos. Cada fragmento corresponde a una partición específica, por lo que dado que todos los elementos con la misma clave de partición deben estar presentes en la misma partición, también significa que esos elementos estarán presentes en el mismo fragmento.
¿Significa esto que puedo lograr lo que necesito automáticamente?"Todos los elementos con la misma partición estarán presentes en el mismo fragmento". ¿Lambda respeta esto?
5) De laPreguntas más frecuentes:
No se garantiza el orden de los registros en diferentes fragmentos y el procesamiento de cada fragmento se realiza en paralelo.
No me importa el orden global, solo el lógico como por ejemplo. Aún así, no está claro si los fragmentos se agrupan lógicamente con esta respuesta de las preguntas frecuentes.
Respuesta1
¿Ayuda esta respuesta?
https://stackoverflow.com/questions/44266633/how-do-dynamodb-streams-distribute-records-to-shards
No se garantiza el orden de los registros en diferentes fragmentos y el procesamiento de cada fragmento se realiza en paralelo.