ElastiCache no es bala de plata: rendimiento Node.js 22 con Undici
Cuando una aplicación Node.js 22 empieza a mostrar latencia elevada o errores intermitentes, es tentador mirar hacia soluciones de caché como ElastiCache. La promesa de una capa de almacenamiento en memoria gestionada por AWS parece imbatible, pero la experiencia demuestra que ni la mejor caché puede ocultar problemas de arquitectura más profundos. En este artículo exploramos un caso real donde el cuello de botella no estaba en la base de datos, sino en la elección del cliente HTTP y la propagación del contexto de petición. Abordaremos cómo identificar la causa raíz, las soluciones técnicas aplicables y cómo una empresa de desarrollo de aplicaciones a medida puede evitar que estas situaciones se conviertan en crisis de rendimiento.
ElastiCache, como servicio cloud de AWS, ofrece una gestión sencilla de clústeres Redis o Memcached. Sin embargo, asumir que añadiendo una capa de caché se resolverán todos los problemas de rendimiento es un error común. En un entorno Node.js 22, factores como la incompatibilidad parcial con Valkey (el fork de Redis que puede encontrarse en ciertas configuraciones de ElastiCache Serverless) generan errores como VALKEY_NOT_FOUND que no se solucionan simplemente con más caché. Además, los cold starts de Lambda, aunque mitigados, siguen siendo un factor que impacta en la latencia global. Lo que realmente importa es la comunicación entre microservicios y el manejo eficiente de las peticiones HTTP.
Tras meses de diagnóstico, el equipo encontró que el cliente HTTP por defecto de Node.js (basado en http nativo) no estaba optimizado para conexiones persistentes ni para el manejo asíncrono moderno. Sustituirlo por Undici, un cliente HTTP rápido y compatible con fetch, redujo drásticamente el tiempo de respuesta. No obstante, el cambio trajo consigo un nuevo desafío: la propagación del contexto de petición. En aplicaciones que requieren trazar solicitudes a través de múltiples servicios, perder el contexto (por ejemplo, un ID de correlación) provoca errores y reintentos innecesarios.
La solución vino de la mano de AsyncLocalStorage, una API incluida en Node.js que permite mantener un contexto asíncrono a lo largo de Promises y callbacks. Al combinarlo con Undici, cada petición lleva asociada su contexto sin necesidad de pasarlo explícitamente por cada función. Esto no solo mejora el rendimiento —con benchmarks que pasaron de 200 ms a 50 ms de media—, sino que también simplifica el código y reduce errores. No obstante, hay que tener cuidado con las versiones antiguas de Node.js donde el contexto puede perderse en setImmediate(); afortunadamente, Node.js 22 ya maneja esto correctamente.
Este caso ilustra por qué el rendimiento no se resuelve solo con infraestructura. Las servicios cloud AWS y Azure ofrecen herramientas potentes, pero requieren un diseño de software a medida que contemple la concurrencia, el manejo de errores y la instrumentación. En Q2BSTUDIO integramos inteligencia artificial y agentes IA para empresas en procesos de monitorización, así como soluciones de ciberseguridad y Business Intelligence con Power BI. Nuestra experiencia en aplicaciones a medida nos permite identificar si un problema de rendimiento requiere una capa de caché o, como en este caso, una revisión profunda del stack de comunicaciones.
La lección final es clara: antes de escalar recursos, analice el comportamiento de sus clientes HTTP, la propagación de contexto y las dependencias de bibliotecas. La optimización desde el código suele ser más efectiva y económica que añadir infraestructura. Si su equipo necesita ayuda para diagnosticar problemas de rendimiento en Node.js o diseñar una arquitectura robusta, en Q2BSTUDIO ofrecemos consultoría especializada en software a medida, ia para empresas y servicios inteligencia de negocio que transforman los datos en decisiones.
Comentarios