Después de de una prolongada compilación de información hemos podido resolver este apuro que tienen algunos los usuarios. Te compartimos la solución y esperamos servirte de gran ayuda.
Solución:
Descargo de responsabilidad: soy el mantenedor del proyecto Dynamodb-mapper
Flujo de trabajo intuitivo de un incremento automático key:
- obtener la última posición del contador
- añadir 1
- usar el nuevo número como el índice del objeto
- guardar el nuevo valor del contador
- guardar el objeto
Esto es sólo para explicar la idea subyacente. Nunca lo hagas de esta manera porque no es atómico. Bajo cierta carga de trabajo, puede asignar el mismo ID a más de 2 objetos diferentes porque no es atómico. Esto resultaría en una pérdida de datos.
La solución es utilizar el AGREGAR atómico operación junto con TODO NUEVO de UpdateItem:
- generar atómicamente una identificación
- usar el nuevo número como el índice del objeto
- guardar el objeto
En el peor de los casos, la aplicación falla antes de que se guarde el objeto, pero nunca se arriesgue a asignar la misma ID dos veces.
Queda un problema pendiente: ¿dónde almacenar el último valor de ID? Nosotros elegimos:
"hash_key"=-1, #0 was judged too risky as it is the default value for integers.
"__max_hash_key__y"=N
Por supuesto, para que funcione de manera confiable, todas las aplicaciones que insertan datos DEBEN conocer este sistema; de lo contrario, es posible que (nuevamente) sobrescriba los datos.
el último paso es automatizar el proceso. Por ejemplo:
When hash_key is 0:
atomically_allocate_ID()
actual_save()
Para obtener detalles de implementación (Python, lo siento), consulte https://bitbucket.org/Ludia/dynamodb-mapper/src/8173d0e8b55d/dynamodb_mapper/model.py#cl-67
A decir verdad, mi empresa no lo usa en producción porque, la mayoría de las veces, es mejor buscar otro key como, para el usuario, una identificación, para una transacción, una fecha y hora, …
Escribí algunos ejemplos en la documentación de dynamodb-mapper y se pueden extrapolar fácilmente a Node.JS
Si usted tiene alguna pregunta no dude en preguntar.
Otro enfoque es utilizar un UUID
generador para primaria keyscomo estos son muy improbable que choque.
En mi opinión, es más probable que experimente errores al consolidar la primaria key contadores a través de alta disponibilidad DynamoDB
tablas que de los conflictos en generado UUID
s.
Por ejemplo, en Nodo:
npm install uuid
var uuid = require('uuid');
// Generate a v1 (time-based) id
uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'
// Generate a v4 (random) id
uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
Tomado de la respuesta SO.
Si está de acuerdo con las brechas en su identificación creciente, y está de acuerdo con que solo correspondan aproximadamente al orden en que se agregaron las filas, puede crear la suya propia: Cree una tabla separada llamada NextIdTable, con una primaria key (numérico), llámelo Contador.
Cada vez que desee generar una nueva identificación, debe hacer lo siguiente:
- Haga un GetItem en NextIdTable para leer el valor actual de Counter –> curValue
- Realice un PutItem en NextIdTable para establecer el valor de Counter en curValue + 1. Conviértalo en un PutItem condicional para que falle si el valor de Counter ha cambiado.
- Si ese PutItem condicional falló, significa que alguien más estaba haciendo esto al mismo tiempo que tú. Comenzar de nuevo.
- Si tuvo éxito, entonces curValue es su nueva identificación única.
Por supuesto, si su proceso falla antes de aplicar esa ID en cualquier lugar, la “filtrará” y tendrá una brecha en su secuencia de ID. Y si está haciendo esto simultáneamente con algún otro proceso, uno de ustedes obtendrá el valor 39 y otro obtendrá el valor 40, y no hay garantías sobre en qué orden se aplicarán realmente en su tabla de datos; el tipo que obtuvo 40 podría escribirlo antes que el tipo que obtuvo 39. Pero te da un orden aproximado.
Los parámetros para un PutItem condicional en node.js se detallan aquí. http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/frames.html#!AWS/DynamoDB.html. Si previamente había leído un valor de 38 de Counter, su solicitud PutItem condicional podría tener este aspecto.
var conditionalPutParams =
TableName: 'NextIdTable',
Item:
Counter:
N: '39'
,
Expected:
Counter:
AttributeValueList: [
N: '38'
],
ComparisonOperator: 'EQ'
;
Finalizando este artículo puedes encontrar las notas de otros gestores de proyectos, tú todavía eres capaz dejar el tuyo si dominas el tema.