← Volver al catálogo

Amazon DynamoDB

En una frase: Base NoSQL clave-valor sin servidor con latencia de milisegundos a cualquier escala
Documentación oficial: Documentación de Amazon DynamoDB ↗

Qué es

Amazon DynamoDB es una base de datos NoSQL totalmente gestionada y serverless, de tipo clave-valor y documento. Ofrece latencia de un solo dígito de milisegundos a cualquier escala, sin servidores, parches ni versiones que gestionar. A cambio, exige diseñar las tablas a partir de los patrones de acceso, no de las entidades como en SQL (Structured Query Language: lenguaje de consultas de bases de datos relacionales).

Conceptos clave

  • Clave primaria: solo clave de partición, o clave de partición más clave de ordenación. La clave de partición reparte los datos; una mala elección crea particiones calientes.
  • Ítems de hasta 400 KB (incluidos los nombres de los atributos). Para objetos mayores, se guardan en S3 (Simple Storage Service) y en la tabla solo la referencia.
  • Índices:
    • GSI (global): otra clave de partición y de ordenación; se puede crear en cualquier momento; solo lecturas eventualmente consistentes; hasta 20 por tabla por defecto.
    • LSI (local): misma clave de partición y otra de ordenación; solo al crear la tabla; admite lectura fuertemente consistente; hasta 5 por tabla.
  • Query vs Scan: Query busca por clave (eficiente); Scan recorre toda la tabla (caro y lento). El filtro se aplica después de leer, así que no ahorra capacidad.
  • Modos de capacidad: bajo demanda (pago por petición, sin planificar) o aprovisionado (RCU/WCU, con auto scaling y capacidad reservada). 1 WCU (Write Capacity Unit: unidad de capacidad de escritura) = una escritura por segundo de hasta 1 KB; 1 RCU (Read Capacity Unit: unidad de capacidad de lectura) = una lectura fuertemente consistente por segundo de hasta 4 KB, o dos eventualmente consistentes.
  • Transacciones ACID (atomicidad, consistencia, aislamiento y durabilidad de las transacciones) sobre varios ítems y tablas.
  • DynamoDB Streams: registro ordenado de cambios durante 24 horas, que puede disparar Lambda.
  • DAX (DynamoDB Accelerator: caché en memoria para DynamoDB): caché en memoria compatible con la API (Application Programming Interface: interfaz para que los programas se comuniquen), con latencias de microsegundos para cargas de lectura intensiva.
  • Global Tables: réplicas multirregión activo-activo, con consistencia eventual o fuerte entre regiones (MRSC).
  • TTL (Time To Live: tiempo de vida antes de caducar): borra ítems caducados sin coste de escritura.
  • Copias de seguridad: bajo demanda y recuperación a un momento dado (PITR) de hasta 35 días.

Casos de uso típicos

  • Backends serverless con Lambda: perfiles de usuario, carritos, catálogos.
  • Sesiones, tablas de clasificación de juegos, contadores con escalado masivo.
  • Datos de IoT (Internet of Things: internet de las cosas: dispositivos conectados) o eventos con acceso por clave y TTL.
  • Metadatos de objetos guardados en S3.
  • Aplicaciones globales con escrituras en varias regiones (Global Tables).

Cuándo NO usarlo

  • Consultas ad hoc complejas, JOIN o informes analíticos: mejor una base relacional (RDS (Relational Database Service), Aurora) o un almacén analítico (Redshift, Athena sobre una exportación a S3).
  • Ítems mayores de 400 KB, como ficheros o documentos grandes: S3.
  • Búsqueda de texto completo: OpenSearch.
  • Si no conoces los patrones de acceso de antemano.

Comparativa con servicios parecidos

NecesidadServicio adecuado
Clave-valor a escala, serverlessDynamoDB
Relacional con SQL y JOINRDS o Aurora
Caché de microsegundos para DynamoDBDAX
Caché general (sesiones, resultados)ElastiCache
Compatibilidad con MongoDBDocumentDB
Compatibilidad con CassandraKeyspaces

Modelo de precios

En bajo demanda se paga por petición de lectura y escritura. En aprovisionado, por la capacidad por hora (RCU y WCU), con descuentos por capacidad reservada. Además se paga el almacenamiento por GB al mes (la clase Standard-IA lo abarata para tablas poco consultadas), las copias de seguridad, Streams, las réplicas globales y la transferencia de datos.

Seguridad y alta disponibilidad

  • Datos replicados en tres zonas de disponibilidad de la región.
  • Cifrado en reposo siempre activo (clave de AWS o de KMS (Key Management Service) gestionada por el cliente).
  • Control de acceso con IAM (Identity and Access Management), incluso por ítem o atributo con condiciones (dynamodb:LeadingKeys).
  • Endpoint de VPC (Virtual Private Cloud) de tipo gateway (gratuito) para acceder sin salir a internet.
  • PITR contra borrados o escrituras erróneas; Global Tables para recuperación ante desastres multirregión.

Así lo uso en Kopi

DynamoDB es la única base de datos de Kopi, en modo bajo demanda. Elegí una tabla por entidad en vez de single-table design, porque para un proyecto pequeño pesa más la legibilidad. Cada patrón de acceso (por usuario, por categoría, por tipo) tiene su GSI, y la paginación usa LastEvaluatedKey, porque no existe un OFFSET. Una lección real: Limit se aplica antes que FilterExpression, así que una consulta con filtro puede devolver menos resultados de los pedidos, o ninguno, aunque haya más.

Trampas de examen

  • "Latencia de microsegundos" en lecturas de DynamoDB: DAX (no ElastiCache).
  • "Tráfico impredecible" o "sin planificar capacidad": bajo demanda.
  • "Reaccionar a cambios en la tabla": Streams más Lambda.
  • "Borrar datos antiguos automáticamente y sin coste": TTL.
  • "Activo-activo multirregión": Global Tables.
  • "Consultar por otro atributo": GSI. Si piden lectura fuertemente consistente con otra clave de ordenación y la tabla es nueva: LSI.
  • "Error de limitación (throttling) en una partición": mala distribución de la clave de partición (partición caliente).

Preguntas de práctica

Preguntas originales escritas para estos apuntes. No son preguntas reales de examen.

Fuentes