tutorial query dynamodb database nosql amazon-web-services cloud amazon-dynamodb

database - tutorial - dynamodb query



¿Cuál es la forma recomendada de eliminar una gran cantidad de elementos de DynamoDB? (5)

Estoy escribiendo un servicio de registro simple en DynamoDB.

Tengo una tabla de registros que está marcada por un hash user_id y un rango de marca de tiempo (Unix epoch int).

Cuando un usuario del servicio finaliza su cuenta, necesito eliminar todos los elementos en la tabla, independientemente del valor del rango.

¿Cuál es la forma recomendada de hacer este tipo de operación (teniendo en cuenta que podría haber millones de elementos para eliminar)?

Mis opciones, hasta donde puedo ver son:

R: Realice una operación de escaneo, llamando a eliminar en cada artículo devuelto, hasta que no queden elementos

B: Realice una operación BatchGet, nuevamente llamando a eliminar en cada elemento hasta que no quede ninguno

Ambas cosas me parecen terribles ya que tomarán mucho tiempo.

Lo que idealmente quiero hacer es llamar a LogTable.DeleteItem (user_id) - Sin suministrar el rango, y que lo elimine todo por mí.


Lo que idealmente quiero hacer es llamar a LogTable.DeleteItem (user_id) - Sin suministrar el rango, y que lo elimine todo por mí.

Una solicitud comprensible de hecho; Me imagino que el equipo de AWS podría agregar operaciones avanzadas como estas a lo largo del tiempo (tienen un historial de comenzar con un conjunto de características limitado primero y evaluar las extensiones según los comentarios de los clientes), pero esto es lo que debe hacer para evitar el costo de un escaneo completo al menos:

  1. Use Query lugar de Scan para recuperar todos los elementos para user_id : esto funciona independientemente de la clave principal combinada hash / range en uso, porque HashKeyValue y RangeKeyCondition son parámetros separados en esta API y el primero solo se dirige al valor de atributo del componente hash del clave primaria compuesta. .

    • Tenga en cuenta que tendrá que ocuparse de la paginación de la API de consulta aquí como de costumbre, consulte el parámetro ExclusiveStartKey :

      Clave principal del elemento desde el que continuar una consulta anterior. Una consulta anterior podría proporcionar este valor como LastEvaluatedKey si esa operación de consulta se interrumpió antes de completar la consulta; ya sea por el tamaño del conjunto de resultados o el parámetro Límite. LastEvaluatedKey se puede volver a pasar en una nueva solicitud de consulta para continuar la operación desde ese punto.

  2. DeleteItem todos los elementos devueltos y facilita DeleteItem como de costumbre

    • Actualización : lo más probable es que BatchWriteItem sea ​​más apropiado para un caso de uso como este (ver más abajo para más detalles).

Actualizar

Como destaca ivant , la operación BatchWriteItem permite colocar o eliminar varios elementos en varias tablas en una sola llamada API [énfasis mío] :

Para cargar un elemento, puede usar la API de PutItem y para eliminar un elemento, puede usar la API de DeleteItem. Sin embargo, cuando desee cargar o eliminar grandes cantidades de datos, como cargar grandes cantidades de datos de Amazon Elastic MapReduce (EMR) o migrar datos de otra base de datos a Amazon DynamoDB, esta API ofrece una alternativa eficiente.

Tenga en cuenta que esto todavía tiene algunas limitaciones relevantes, más notablemente:

  • Operaciones máximas en una sola solicitud : puede especificar un total de hasta 25 operaciones de envío o eliminación; sin embargo, el tamaño total de la solicitud no puede exceder 1 MB (la carga útil HTTP).

  • No es una operación atómica: las operaciones individuales especificadas en un BatchWriteItem son atómicas; sin embargo, BatchWriteItem como un todo es una operación de "mejor esfuerzo" y no una operación atómica. Es decir, en una solicitud BatchWriteItem, algunas operaciones pueden tener éxito y otras pueden fallar. [...]

Sin embargo, esto obviamente ofrece una ganancia potencialmente significativa para casos de uso como el que tenemos a mano.


De acuerdo con la documentación de DynamoDB, puede eliminar la tabla completa.

Vea abajo:

"Eliminar una tabla completa es significativamente más eficiente que eliminar los elementos uno a uno, lo que básicamente duplica el rendimiento de escritura al igual que muchas operaciones de eliminación como operaciones de colocación"

Si desea eliminar solo un subconjunto de sus datos, puede crear tablas separadas para cada mes, año o similar. De esta forma, podría eliminar "el último mes" y mantener el resto de sus datos intactos.

Así es como elimina una tabla en Java utilizando AWS SDK:

DeleteTableRequest deleteTableRequest = new DeleteTableRequest() .withTableName(tableName); DeleteTableResult result = client.deleteTable(deleteTableRequest);


La respuesta a esta pregunta depende de la cantidad de artículos, su tamaño y su presupuesto. Depende de que tengamos 3 casos siguientes:

1- La cantidad de ítems y el tamaño de los ítems en la tabla no son muchos. luego, como dijo Steffen Opel, puede usar la función de consulta en lugar de la exploración para recuperar todos los elementos de user_id y luego recorrer todos los elementos devueltos y facilitar DeleteItem o BatchWriteItem . Pero tenga en cuenta que puede quemar mucha capacidad de rendimiento aquí. Por ejemplo, considere una situación en la que necesite eliminar 1000 elementos de una tabla DynamoDB. Supongamos que cada elemento tiene 1 KB de tamaño, lo que genera alrededor de 1 MB de datos. Esta tarea de eliminación masiva requerirá un total de 2000 unidades de capacidad de escritura para consulta y eliminación. Para realizar esta carga de datos en 10 segundos (que ni siquiera se considera tan rápido en algunas aplicaciones), necesitaría establecer el rendimiento de escritura aprovisionado de la tabla en 200 unidades de capacidad de escritura. Como puede ver, es factible usarlo de esta manera si se trata de menos artículos o artículos de pequeño tamaño.

2- Tenemos muchos artículos o artículos muy grandes en la mesa y podemos almacenarlos según el tiempo en diferentes tablas. Entonces, como jonathan dijo, puedes borrar la tabla. esto es mucho mejor, pero no creo que coincida con su caso. Como quiera eliminar todos los datos de los usuarios, sin importar la hora de creación de registros, en este caso no puede eliminar una tabla en particular. si quieres tener una mesa separada para cada usuario, entonces supongo que si la cantidad de usuarios es alta, entonces es muy costoso y no es práctico para tu caso.

3- Si tiene muchos datos y no puede dividir sus datos fríos y calientes en diferentes tablas y necesita hacer una eliminación a gran escala con frecuencia, desafortunadamente DynamoDB no es una buena opción para usted. Puede volverse más costoso o muy lento (depende de su presupuesto). En estos casos, recomiendo buscar otra base de datos para sus datos.


No tenemos la opción de truncar las tablas de dynamo. tenemos que soltar la tabla y crear de nuevo. DynamoDB nos cobra en base a ReadCapacityUnits & WriteCapacityUnits. Si eliminamos todos los elementos utilizando la función BatchWriteItem, usará WriteCapacityUnits. Así que es mejor eliminar registros específicos o eliminar la tabla y comenzar de nuevo.


Si desea eliminar elementos después de un tiempo, por ejemplo, después de un mes, simplemente use la opción Tiempo para vivir. No contará unidades de escritura.

En su caso, agregaría ttl cuando los registros caduquen y los deje después de que se elimine a un usuario. TTL se aseguraría de que los registros se eliminen eventualmente.

Cuando Time To Live está habilitado en una tabla, un trabajo en segundo plano comprueba el atributo TTL de los elementos para ver si están caducados.

DynamoDB típicamente elimina los artículos vencidos dentro de las 48 horas de su vencimiento. La duración exacta dentro de la cual un elemento se elimina realmente después de la caducidad es específico para la naturaleza de la carga de trabajo y el tamaño de la tabla. Los elementos que han expirado y no se han eliminado seguirán apareciendo en lecturas, consultas y escaneos. Estos elementos aún se pueden actualizar y se cumplirán las actualizaciones exitosas para cambiar o eliminar el atributo de caducidad.

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html