Estoy escribiendo un servicio de registro simple en DynamoDB.
Tengo una tabla de registros que está codificada por un hash user_id y un rango de marca de tiempo (Unix epoch int).
Cuando un usuario del servicio cancela su cuenta, necesito eliminar todos los elementos de la tabla, independientemente del valor del rango.
¿Cuál es la forma recomendada de realizar este tipo de operación (teniendo en cuenta que podría haber millones de elementos para eliminar)?
Mis opciones, por lo que puedo ver, son:
R: Realice una operación de escaneo, llamando a eliminar en cada artículo devuelto, hasta que no quede ningún artículo
B: Realice una operación BatchGet, nuevamente llamando a eliminar en cada elemento hasta que no quede ninguno
Ambos me parecen terribles, ya que tomarán mucho tiempo.
Lo que idealmente quiero hacer es llamar a LogTable.DeleteItem (user_id) - Sin proporcionar el rango, y hacer que elimine todo por mí.
BatchWriteItem
elementos debe especificarse a través deTableWriteItems
batch_writer()
como parte de laboto3.resource.Table
API que "manejará automáticamente el almacenamiento en búfer y el envío de elementos en lotes. Además, el escritor de lotes también maneja automáticamente cualquier elemento no procesado y reenvíalo según sea necesario "es decir, es un envoltorio alrededor de BatchWriteItem que administra las partes molestas. boto3.amazonaws.com/v1/documentation/api/latest/reference/…Según la documentación de DynamoDB, puede eliminar la tabla completa.
Vea abajo:
"Eliminar una tabla completa es significativamente más eficiente que eliminar elementos uno por uno, lo que básicamente duplica el rendimiento de escritura, ya que realiza tantas 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 manera, podría eliminar "el mes pasado" y mantener intactos el resto de sus datos.
Así es como se elimina una tabla en Java con el AWS SDK:
fuente
Si desea eliminar elementos después de un tiempo, por ejemplo, después de un mes, simplemente use la opción Tiempo de vida. Será no contar con unidades de escritura.
En su caso, agregaría ttl cuando vencen los registros y los dejaría después de que se elimine un usuario. TTL se aseguraría de que los registros se eliminen eventualmente.
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html
fuente
La respuesta a esta pregunta depende de la cantidad de artículos, su tamaño y su presupuesto. Depende de que tengamos los siguientes 3 casos:
1- El número de elementos y el tamaño de los elementos de la tabla no son muchos. luego, como dijo Steffen Opel, puede usar Query en lugar de Scan para recuperar todos los elementos para user_id y luego recorrer todos los elementos devueltos y facilitar
DeleteItem
oBatchWriteItem
. Pero tenga en cuenta que puede quemar mucha capacidad de rendimiento aquí. Por ejemplo, considere una situación en la que necesita eliminar 1000 elementos de una tabla de DynamoDB. Suponga que cada elemento tiene un tamaño de 1 KB, lo que da como resultado alrededor de 1 MB de datos. Esta tarea de eliminación masiva requerirá un total de 2000 unidades de capacidad de escritura para realizar consultas y eliminar. 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 es para una menor cantidad de artículos o artículos de tamaño pequeño.2- Tenemos muchos artículos o artículos muy grandes en la mesa y podemos almacenarlos según el tiempo en diferentes mesas. Entonces, como dijo Jonathan, puede eliminar la tabla. esto es mucho mejor, pero no creo que coincida con su caso. Como desea eliminar todos los datos de los usuarios sin importar la hora de creación de los registros, en este caso no puede eliminar una tabla en particular. Si desea tener una tabla separada para cada usuario, supongo que si el número de usuarios es alto, entonces es muy caro y no es práctico para su caso.
3- Si tiene una gran cantidad de datos y no puede dividir sus datos calientes y fríos en diferentes tablas y necesita hacer una eliminación a gran escala con frecuencia, lamentablemente DynamoDB no es una buena opción para usted. Puede resultar más caro o muy lento (depende de su presupuesto). En estos casos recomiendo buscar otra base de datos para sus datos.
fuente
Mi enfoque para eliminar todas las filas de una tabla en DynamoDb es simplemente extraer todas las filas de la tabla, usar DynamoDbs ScanAsync y luego enviar la lista de resultados a DynamoDbs AddDeleteItems. El siguiente código en C # funciona bien para mí.
Nota: Eliminar la tabla y luego volver a crearla desde la consola web puede causar problemas si usa YAML / CloudFront para crear la tabla.
fuente
No tenemos la opción de truncar las tablas de dinamo. tenemos que soltar la mesa y volver a crear. Los cargos de DynamoDB se basan en ReadCapacityUnits y WriteCapacityUnits. Si eliminamos todos los elementos usando la función BatchWriteItem, usará WriteCapacityUnits. Así que es mejor eliminar registros específicos o eliminar la tabla y comenzar de nuevo.
fuente