Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Amazon ElastiCache (Valkey) para aplicaciones de comercio electrónico
Una aplicación de comercio electrónico se beneficia de una capa de caché en memoria entre los servidores de aplicaciones y la base de datos. Amazon con ElastiCache Valkey proporciona una latencia de lectura inferior a un milisegundo para los datos a los que se accede con frecuencia (entradas del catálogo de productos, recuentos de inventario, resultados de búsqueda y sesiones de usuario), lo que reduce la carga de la base de datos y mejora los tiempos de respuesta en caso de picos de tráfico.
Configuración del clúster
Elija un tipo de clúster en función del volumen de datos, los requisitos de rendimiento y las preferencias operativas.
| Tipo de clúster | Lo mejor para | Escalado | Consideraciones |
|---|---|---|---|
Sin servidor |
Patrones de tráfico variables, aplicaciones nuevas, equipos sin experiencia en operaciones de caché |
Automático: escala el procesamiento y la memoria en función de la demanda |
No se necesita planificar la capacidad. Modelo de costo variable: paga por lo que consume. |
Node-based (modo de clúster activado) |
Cargas de trabajo predecibles y de alto rendimiento, que requieren un control detallado sobre los tipos de nodos y la fragmentación |
Escalado manual o automático de fragmentos y réplicas |
Requiere una planificación de la capacidad. Modelo de costo fijo: se paga por la capacidad aprovisionada independientemente de la utilización. Soporta hasta 500 nodos por clúster. |
Para la mayoría de las aplicaciones de comercio electrónico que se están iniciando, Serverless proporciona la ruta más sencilla hacia la producción. Migre a clústeres basados en nodos cuando tenga líneas de base de tráfico predecibles y necesite más control sobre la topología de los clústeres, los tipos de nodos y el comportamiento de escalado.
| Opción | Valor | Justificación |
|---|---|---|
Motor |
Última versión estable |
Utilice la última versión estable de Valkey disponible en ElastiCache. Totalmente compatible con los comandos de Redis OSS. Proporciona mejoras de rendimiento con respecto a las versiones anteriores. |
Multi-AZ |
Habilitado |
Conmutación por error automática a una réplica de otra zona de disponibilidad si se produce un error en el nodo principal. Necesaria para las cargas de trabajo de comercio electrónico de producción. |
In-transit cifrado |
Habilitado (TLS) |
Cifra los datos entre la aplicación y el clúster de caché. Necesario para las cargas de trabajo que gestionan las sesiones de usuario o cualquier información de identificación personal. |
At-rest cifrado |
Habilitado |
Cifra los datos del disco (copias de seguridad, intercambio). Necesario para las cargas de trabajo de cumplimiento. |
Grupo de subredes |
Subredes aisladas privadas (más de 2 zonas de servicio) |
Sin acceso a Internet. Solo se puede acceder a él desde el grupo de seguridad de la aplicación. |
Diseño clave para los datos del producto
Diseñe las claves de caché para que sean predecibles, se puedan depurar y tengan un alcance específico para evitar colisiones entre los tipos de datos.
| Tipo de datos: | Patrón clave | Tipo de valor | Ejemplo |
|---|---|---|---|
Detalles del producto |
|
Hash |
|
Recuento de inventario |
|
Cadena (entero) |
|
Sesión de usuario |
|
Hash |
|
Resultados de búsqueda |
|
Cadena (JSON) |
|
Listado de categorías |
|
Enumeración |
|
Mejores prácticas clave de diseño:
Utilice dos puntos como separadores para facilitar la lectura y facilitar las herramientas.
Mantenga las claves cortas: las claves largas consumen memoria y ancho de banda de red.
Incluye el prefijo del tipo de datos para evitar colisiones entre productos, sesiones y otras entidades que puedan compartir identificadores numéricos.
Usa hashes para objetos de varios campos (productos, sesiones) para permitir lecturas y actualizaciones parciales sin recuperar el valor completo.
Estrategia de TTL por tipo de datos
Establezca valores de TTL (tiempo de vida útil) en función de la frecuencia con la que cambian los datos y de su obsolescencia sin afectar a la experiencia del cliente.
| Tipo de datos: | TTL | Activador de invalidación | Justificación |
|---|---|---|---|
Detalles del producto |
5 minutos |
El vendedor edita el producto |
Las descripciones y las imágenes de los productos cambian con poca frecuencia. Lo suficientemente cortas como para realizar las modificaciones con una rapidez razonable sin invalidarlas explícitamente cada cambio. |
Recuento de inventario |
30 segundos |
Comprar o reabastecer |
El inventario obsoleto puede provocar ventas excesivas. Un TTL muy corto garantiza que los recuentos se actualicen con frecuencia. Invalidación explícita en el momento de la compra para una precisión inmediata. |
Resultados de búsqueda |
60 segundos |
Ninguno (TTL-based solo) |
Los índices de búsqueda se actualizan periódicamente. El almacenamiento en caché reduce la carga de los motores de búsqueda. Los nuevos productos aparecen en 60 segundos sin invalidaciones explícitas. |
Sesión de usuario |
24 horas |
Cierre de sesión o caducidad de la sesión |
Las sesiones persisten durante la navegación. Actualiza el TTL en cada acceso para mantener activas las sesiones. Elimine de forma explícita al cerrar sesión. |
Listado de categorías |
2 minutos |
Producto added/removed de la categoría |
Las páginas de categorías tienen mucho tráfico. El almacenamiento en caché breve reduce considerablemente las consultas a la base de datos durante la navegación. |
Cache-aside patrón
El patrón de almacenamiento en caché (también denominado carga diferida) es la estrategia de almacenamiento en caché más común para las aplicaciones de comercio electrónico. La aplicación comprueba primero la caché y solo consulta la base de datos si no se encuentra en la memoria caché.
Ruta de lectura (pseudocódigo)
FUNCTION getProduct(productId): cacheKey = "product:" + productId // Step 1: Check the cache cachedValue = cache.GET(cacheKey) IF cachedValue exists: RETURN deserialize(cachedValue) // Cache hit — sub-millisecond // Step 2: Cache miss — query database product = database.query("SELECT * FROM products WHERE id = ?", productId) IF product not found: RETURN null // Step 3: Write to cache with TTL cache.SET(cacheKey, serialize(product), EXPIRE = 300) // 5 minutes RETURN product
Ruta de escritura (pseudocódigo)
FUNCTION updateProduct(productId, updatedFields): // Step 1: Update the database (source of truth) database.update("UPDATE products SET ... WHERE id = ?", updatedFields, productId) // Step 2: Invalidate the cache (don't update it) cache.DELETE("product:" + productId) // Next read will trigger a cache miss and repopulate from database
importante
Al escribir, invalide (elimine) siempre la caché en lugar de actualizarla. Esto reduce el margen para las condiciones de carrera en las que una lectura obsoleta sobrescribe un valor más reciente. La siguiente lectura rellena la caché a partir de la base de datos, que es la fuente de la verdad. Tenga en cuenta que sigue existiendo una condición limitada: si una lectura simultánea obtiene datos de la base de datos antes de que se produzca la escritura, puede volver a llenar la caché con datos obsoletos una vez que la clave de caché ya se haya eliminado. Para la mayoría de las cargas de trabajo de comercio electrónico, el TTL abreviado lo hace aceptable. Si necesita una coherencia estricta, utilice un bloqueo distribuido o escrituras versionadas.
Cómo gestionar los errores de caché
FUNCTION getProductWithFallback(productId): TRY: RETURN getProduct(productId) // Normal cache-aside path CATCH cacheConnectionError: // Cache is unavailable — fall back to database directly RETURN database.query("SELECT * FROM products WHERE id = ?", productId) // Log the error, trigger an alarm, but don't fail the request
Diseñe su aplicación de manera que los errores de la caché reduzcan el rendimiento (respuestas más lentas) pero no interrumpan la funcionalidad. La base de datos sirve como respaldo.
Estrategias de invalidación de caché
La invalidación garantiza que los usuarios vean los datos actuales después de las actualizaciones. Elija una estrategia en función de la rapidez con la que deben ser visibles los cambios.
| Método | Funcionamiento | Cuándo se debe usar |
|---|---|---|
Eliminar al escribir |
La aplicación elimina la clave de caché inmediatamente después de actualizar la base de datos. |
La mayoría de las escrituras (ediciones de productos, cambios de inventario). Simple, confiable, evita datos obsoletos. |
Solo caduca el TTL |
No invalide: deje que el TTL caduque de forma natural. |
Datos en los que se acepta un estancamiento breve (resultados de búsqueda, listados de categorías, análisis). |
Event-driven invalidación |
Un proceso en segundo plano escucha los eventos de cambio de la base de datos e invalida las claves afectadas. |
Sistemas en los que la ruta de escritura y la memoria caché se encuentran en diferentes servicios o en los que un único cambio en la base de datos afecta a muchas claves de la memoria caché. |
En el caso de las aplicaciones de marketplace que también utilizan Amazon CloudFront como capa de CDN, coordine la invalidación en ambos niveles: elimine la ElastiCache clave y envíe una invalidación de la caché (o una invalidación de las etiquetas de CloudFront caché) para que los usuarios vean el contenido actualizado tanto en la capa de aplicación como en la capa perimetral.
Administración de conexiones
-
Usa la agrupación de conexiones: la creación de una nueva conexión TLS para cada operación de caché añade latencia. Mantenga un grupo de conexiones persistentes y reutilícelas en todas las solicitudes.
-
Establezca tiempos de espera de conexión: utilice un tiempo de espera de conexión corto (1 a 2 segundos) y un tiempo de espera de comando más corto (100 a 500 ms). Si la caché no responde rápidamente, recurra a la base de datos en lugar de bloquear la solicitud.
-
Gestione la conmutación por error correctamente: cuando se produce una Multi-AZ conmutación por error, se interrumpen las conexiones a la antigua instancia principal. Su grupo de conexiones debe detectar las conexiones rotas y volver a conectarse automáticamente. La mayoría de las bibliotecas cliente se ocupan de esto, pero verifica el comportamiento durante la prueba.
-
Utilice el punto final de configuración del clúster: si está habilitado el modo clúster, conéctese al punto final de configuración en lugar de a los puntos finales de los nodos individuales. El punto final de configuración dirige automáticamente las solicitudes al fragmento correcto.
Métricas clave que se deben supervisar
| Métrica | Threshold | Periodo | Action |
|---|---|---|---|
CacheHitRate |
< 80% |
5 min |
Investiga: una tasa de aciertos baja significa que tus TTL pueden ser demasiado cortos, que las claves están mal diseñadas o que el conjunto de trabajo supera la memoria. |
EngineCPUUtilization |
> 70% |
5 min |
Amplíe hacia arriba (nodos más grandes) o hacia afuera (más fragmentos). Un nivel alto de CPU indica que la memoria caché procesa más comandos de los que puede gestionar de manera eficiente. |
DatabaseMemoryUsagePercentage |
> 80% |
5 min |
Riesgo de desalojos. Aumente la memoria (amplíe) o reduzca los datos almacenados (TTL más cortos, menos tipos de datos en caché). |
Evictions |
> 0 sostenidos |
1 min |
La caché está llena y se están eliminando datos para dejar espacio. Aumenta las pérdidas de caché. Amplíe la memoria o reduzca los TTL de los datos menos críticos. |
CurrConnections |
> El 80% del tamaño de su grupo de clientes |
5 min |
El pool de conexiones está a punto de agotarse. Aumente el tamaño del grupo, reduzca el tiempo de espera de las conexiones o investigue las fugas de conexión en el código de la aplicación. Base el umbral en el tamaño del grupo configurado para la aplicación, no en el máximo de servidores (65 000). |
Preguntas frecuentes
¿Cuándo debo usar sin servidor y cuándo usar uno basado en nodos?
Usa Serverless cuando tu tráfico sea impredecible (nuevos mercados, picos estacionales), cuando quieras evitar la planificación de la capacidad o cuando tu equipo no tenga experiencia en operaciones de almacenamiento en caché. Cambie a la tecnología basada en nodos cuando sus patrones de tráfico sean estables, necesite un control detallado de la fragmentación o cuando su rendimiento sostenido haga que la tecnología basada en nodos sea más rentable.
¿Debo usar Valkey o Redis OSS?
Use Valkey para nuevas implementaciones. Valkey es el motor predeterminado para los ElastiCache clústeres nuevos, es totalmente compatible con los comandos y las estructuras de datos de Redis OSS y está en continuo desarrollo. Los clústeres de Redis OSS existentes siguen funcionando: migre a Valkey cuando sea conveniente mediante la actualización local del motor.
¿Qué ocurre cuando la memoria caché no está disponible?
La aplicación debe tratar la memoria caché como una optimización, no como una dependencia. Si la caché no está disponible, vuelva a consultar la base de datos directamente. Los tiempos de respuesta serán más altos, pero la aplicación seguirá funcionando. Cuando Multi-AZ está habilitada, la falta total de disponibilidad de la caché es poco frecuente; la conmutación por error a una réplica normalmente se completa en menos de 30 segundos.
¿Cómo calculo la memoria que necesito?
Calcule: (número de elementos únicos para almacenar en caché) × (tamaño promedio por elemento) × (factor de sobrecarga de 1,2 para las estructuras de datos de Valkey). La sobrecarga varía según el tamaño del objeto y el tipo de datos; los objetos más pequeños tienen una sobrecarga proporcionalmente mayor. Por ejemplo, 100 000 productos de 2 KB cada uno con una sobrecarga de 1,2 veces = aproximadamente 240 MB. Agregue datos de sesión, resultados de búsqueda y recuentos de inventario. Comience con el margen de ampliación (utilice el 60% de la memoria disponible como objetivo) y supervise la DatabaseMemoryUsagePercentage métrica para ajustarla.